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

464

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

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

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

adardesign
источник
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'

adardesign
источник
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-
adswebwork
источник
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.

Hobbs
источник
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чтобы отменить
C0DEF52
источник
Это так полезно. Спасибо за подробную информацию!
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, предотвратит преждевременное завершение команды в случае ошибок в некоторых файлах цикла.

sagunms
источник
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' снова вывести список всех некэшированных файлов и проверить, сработали ли вышеуказанные команды - теперь это ничего не должно возвращать
Стив Чемберс
источник
-1

Если вы используете eclipse, вам может пригодиться следующее:

нет предположения, что без изменений с затмением

Антонио
источник
1
почему внизу пожалуйста?
Антонио