Skip to content
Опубликовано: 2021-02-12
Теги: git

Перестать следить за изменениями файла

В git есть возможность пометить файл неизмененным. Все изменения в этом файле перестают обновлять связанные с ним git-объекты. Например, это удобно для какого-нибудь конфига или временно добавленных дебаг принтов. Файл престает отображаться в списке измененных файлов.

Но есть два варианта пометить файл неизмененным: assume-unchanged и skip-worktree.

assume-unchanged

Этот файл будет считаться неизмененным в локальном индексе. Но только до тех пор пока от сервера не придут изменения для этого файла. Бит неизменяемости снимется и вы получите конфликт слияния.

--assume-unchanged предпологает, что разработчик не должен изменять этот файл. Например, файлы библиотек или фреймворков.

Перестать отслеживать:

git update-index --assume-unchanged path/to/file

Снова начать отслеживать:

git update-index --no-assume-unchanged path/to/file

skip-worktree

В этом случае файл всегда будет считаться неизмененным, даже когда git знает, что файл изменился или должен быть изменен (команда reset --hard). Всегда будет использоваться локальная версия на момент блокировки от изменений. Отключается только явной командой.

--skip-worktree полезен когда надо заблокировать изменения в файле, который может меняться. Например, какие-либо конфигурационные файлы.

Заблокировать от изменений и отслеживания:

git update-index --skip-worktree path/to/file

Разблокировать и начать отслеживать:

git update-index --no-skip-worktree path/to/file

Добавить алиасы

Надо внести в ~/.gitconfig в секцию [alias]:

hide="update-index --assume-unchanged"
unhide="update-index --no-assume-unchanged"
hidden="!git ls-files -v | grep ^h | sed -e 's|h ||'"
lock="update-index --skip-worktree"
unlock="update-index --no-skip-worktree"
locked="!git ls-files -v | grep ^S | sed -e 's|S ||'"

Источники информации