Отменить git update-index --assume-unchanged <file>


464

То, как вы Git игнорируете просмотр / отслеживание определенного каталога / файла. вы просто запустите это:

git update-index --assume-unchanged <file>

Теперь, как вы отмените это, чтобы они смотрели снова? (Давайте назовем это без предположения.)


5
Просто заметьте, что кажется, что skip-worktree - это, скорее всего, то, что вам лучше использовать, чем предполагать без изменений, если только производительность git не является вашей проблемой. stackoverflow.com/questions/13630849/…
GreenAsJade

Ответы:


588

Чтобы получить отменить / показать каталоги / файлы, для которых установлено, что они не изменяются, запустите :

git update-index --no-assume-unchanged <file>

Чтобы получить список каталогов / файлов, которые assume-unchangedзапускаются следующим образом :

git ls-files -v|grep '^h'


7
Незначительное улучшение в вашем выражении grep, он может использовать «^ [az]» для перехвата всех игнорируемых файлов, поскольку первым буквенным тегом могут быть буквы, отличные от «H» / «h». От git-scm.com/docs/git-ls-files : эта опция определяет статус файла с помощью следующих тегов (с пробелом) в начале каждой строки: H :: cached S :: skip-worktree M: : unmerged R :: удалено / удалено C :: изменено / изменено K :: быть убитым? :: other
Bdoserror

8
Другой полезный трюк git ls-files -v|grep '^h'|cut -c3-, который даст вам только имена файлов без префикса «h».
Retsam

9
Если вы больше не знаете файлы, которые используете assume-unchanged, просто используйте git update-index --really-refresh. С помощью этой команды вам не нужно git ls-filesсначала искать файлы .
TheDmi

104

Если вы часто используете эту команду - возможно, вы захотите использовать для нее и псевдоним. Добавьте к своему глобальному .gitconfig:

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged

Как установить псевдоним (если вы еще не знаете):

git config --configLocation alias.aliasName 'command --options'

Пример:

git config --global alias.hide 'update-index --assume-unchanged'
git config... etc

После сохранения этого .gitconfigвы можете запустить команду очистки.

git hide myfile.ext

или

git unhide myfile.ext

Эта документация Git была очень полезной.

Согласно комментариям, это также полезный псевдоним, чтобы узнать, какие файлы в настоящее время скрыты:

[alias]
    hidden = ! git ls-files -v | grep '^h' | cut -c3-

2
Этот псевдоним также удобен:hidden = ! git ls-files -v | grep '^h' | cut -c3-
Seanf

42

Функция git update-index имеет несколько опций, которые вы можете найти, набрав, как показано ниже:

git update-index --help

Здесь вы найдете различные варианты - как справиться с функцией update-index.

[если вы не знаете имя файла]

git update-index --really-refresh 

[если вы знаете имя файла]

git update-index --no-assume-unchanged <file>

вернет все файлы, которые были добавлены в список игнорирования через.

git update-index --assume-unchanged <file>

git update-index --rereal-refresh, отменить все предположения-неизмененные, что я сделал, спасибо за подсказку
Sérgio

git update-index --no-assume-unchanged <file>спасли мою жизнь .. хорошо, я мог просто синхронизировать папку снова, но я действительно хотел "реальное" решение этой проблемы.
Кагатай Улубай

38

Я предполагаю (хех), что вы имели в виду --assume-unchanged, так как я не вижу никакой --assume-changedвозможности. Инверсия --assume-unchangedесть --no-assume-unchanged.


32

Синтезировать превосходные оригинальные ответы от @adardesign, @adswebwork и @AnkitVishwakarma и комментарии от @Bdoserror, @Retsam, @seanf и @torek, с дополнительными ссылками на документацию и краткими псевдонимами ...

Основные команды

Чтобы вернуть файл, который предполагается неизменным, обратно в нормальное состояние:

git update-index --no-assume-unchanged <file>

Чтобы вывести список всех файлов, которые предполагается неизменными:

git ls-files -v | grep '^[a-z]' | cut -c3-

Чтобы сбросить все предполагаемые неизмененные файлы обратно в нормальное состояние:

git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --

Примечание. Эта команда, которая была указана в другом месте, похоже, больше не сбрасывает все предполагаемые неизмененные файлы (я полагаю, что она использовалась и ранее перечисляла ее как решение):

git update-index --really-refresh

Ярлыки

Чтобы облегчить выполнение этих общих задач в git, добавьте / обновите следующий раздел псевдонимов.gitconfig для вашего пользователя (например, ~/.gitconfigв системе * nix или macOS):

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged
    unhide-all = ! git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --
    hidden = ! git ls-files -v | grep '^[a-z]' | cut -c3-

1
Ведь git hiddenвы можете добиться того же эффекта без псевдонимов или сценариев оболочки, используя !вот так:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

1
--really-refreshне очищает (или больше не делает, возможно, однажды) очистку флагов, предполагающих неизменность, в индексных файлах.
Торек

Спасибо, @torek! Я подтвердил поведение, которое вы описали, и обновил ответ, добавив другое решение для случая «сбросить все».
Уилл Каин

20

Если вы хотите отменить все примененные файлы, предполагая, что они не были сохранены с каким-либо состоянием, а не только кэшированы (git помечает их символом в нижнем регистре), вы можете использовать следующую команду:

git ls-files -v | grep '^[a-z]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged
  1. git ls-files -v распечатает все файлы с их статусом
  2. grep '^[a-z]' будет фильтровать файлы и выбирать только предполагать неизменным
  3. cut -c 3- удалит статус и оставит только пути, вырезая из 3-го символа до конца
  4. tr '\012' '\000' заменит символ конца строки (\ 012) на ноль (\ 000)
  5. xargs -0 git update-index --no-assume-unchangedпередаст все пути, разделенные нулевым символом, git update-index --no-assume-unchangedчтобы отменить

Это так полезно. Спасибо за подробную информацию!
Chamithra Thenuwara

11

Добавляя @adardesignответ, если вы хотите сбросить все файлы, которые были добавлены в assume-unchangedсписок за no-assume-unchangedодин раз, вы можете сделать следующее:

git ls-files -v | grep '^h' | sed 's/^..//' | sed 's/\ /\\ /g' | xargs -I FILE git update-index --no-assume-unchanged FILE || true

Это просто удалит два символа, выведенных из grep, т. Е. "h "Затем исключит все пробелы, которые могут присутствовать в именах файлов, и, наконец || true, предотвратит преждевременное завершение команды в случае ошибок в некоторых файлах цикла.


4

Если вы используете Git Extensions , выполните следующие действия:

  1. Перейти к фиксации окна.
  2. Нажмите на раскрывающемся списке «Изменения в рабочем каталоге» .
  3. Выберите параметр Показать предполагаемые неизмененные файлы .
  4. Щелкните правой кнопкой мыши по файлу, который вы хотите отменить.
  5. Выберите Не предполагать без изменений .

Вы сделали.


0

Ничто здесь не покрыто. Но хотел бы добавить свои 2 цента. Иногда я запускаю сборку, и она меняет множество файлов, а затем я хочу что-то поработать, поэтому эта команда мне очень помогает.

git update-index --assume-unchanged `git status | grep modified | sed 's|modified:||g'| xargs`

Надеюсь, кому-то это тоже пригодится.


Я думаю, что вы бы выиграли от использования, .gitignoreчтобы игнорировать ваши артефакты сборки.
Ник

1
У меня есть, .gitignoreно это иногда, по моему опыту не достаточно. Но я понимаю контекст, в котором вы говорите это.
Тяги Акхилеш

0

Ни одно из решений не работало для меня в Windows - кажется, что он использует заглавные буквы, Hа не hстатус файла, а команда grep требует дополнительной каретки, которая ^также представляет начало строки и отрицательный знак следующего символа.

Решение для Windows

  1. Откройте Git Bash и перейдите в соответствующий каталог верхнего уровня.
  2. git ls-files -v | grep '^^H' перечислить все некэшированные файлы
  3. git ls-files -v | grep '^^H' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree отменить пропуски файлов всех файлов, которые были сделаны через update-index --skip-worktree
  4. git ls-files -v | grep '^^H]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged отменить пропуски файлов всех файлов, которые были сделаны через update-index --assume-unchanged
  5. git ls-files -v | grep '^^H' снова вывести список всех некэшированных файлов и проверить, сработали ли вышеуказанные команды - теперь это ничего не должно возвращать

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.