1. Обзор
Мы используем git update-index
, когда хотим вручную работать с файлами в промежуточной области Git . Эта команда поддерживает две опции, которыми часто злоупотребляют: --assume-untchanged
и --skip-worktree
.
В этом уроке мы увидим, чем отличаются эти два параметра, и предоставим варианты использования каждого из них.
2. Что делает опция « предполагать без изменений
»?
Опция --assume-untchanged
указывает Git временно предположить, что отслеживаемый файл не был изменен в рабочем дереве. Таким образом, сделанные изменения не будут отражены в промежуточной области:
$ git update-index --assume-unchanged assumeunchanged.txt
Мы можем проверить статус файла с помощью git ls-files
:
$ git ls-files -v
$ h assumeunchanged.txt
Здесь тег h
указывает на то, что файл accept-unchanged.txt
помечен опцией « submit-unchanged »
.
Хотя в основном для этой цели использовался параметр « предполагать без изменений», он никогда не предназначался для игнорирования изменений в отслеживаемых файлах . Он предназначен для случаев, когда дорого проверить, была ли изменена группа файлов. Что произойдет, если мы хотим оптимизировать использование ресурсов на медленных файловых системах: git опускает любую проверку целевого файла и не будет сравнивать его версии в рабочем каталоге и в индексе.
Эта функция теряется всякий раз, когда запись целевого файла в индексе изменяется. Это может произойти, когда файл изменен вверх по течению. Чтобы отключить эту опцию, мы можем использовать --no-assume-unchanged
:
$ git update-index --no-assume-unchanged assumeunchanged.txt
3. Что делает опция skip-worktree
?
Опция –skip-worktree
игнорирует незафиксированные изменения в уже отслеженном файле. Независимо от любых изменений, внесенных в рабочее дерево, git всегда будет использовать содержимое файла и атрибуты из промежуточной области. Это полезно, когда мы хотим добавить локальные изменения в файл, не отправляя их в восходящий поток :
$ git update-index --skip-worktree skipworktree.txt
Мы можем проверить статус файла:
$ git ls-files -v
$ S skipworktree.txt
Здесь S
указывает, что skip-worktree.txt
помечен параметром skip-
worktree .
Эта опция автоматически сбрасывается, когда файл изменяется в индексе, т. е. если файл был изменен вверх по течению, и мы его вытащили.
–no-skip-worktree
используется для отключения этой опции. Это полезно в случае, если были помечены неправильные файлы или если обстоятельства изменились и ранее пропущенные файлы больше не следует игнорировать:
$ git update-index --no-skip-worktree skipworktree.txt
4. Различия между вариантами
4.1. Переключение ветвей
Нет проблем при извлечении ветки, когда для файла включена опция –skip-worktree
. Но --assume-untchanged
вызовет ошибку:
$ git checkout another-branch
error: Your local changes to the following files would be overwritten by checkout:
assumeunchanged.txt
Please commit your changes or stash them before you switch branches.
Aborting
Мы можем отключить опцию, чтобы преодолеть эту ситуацию:
$ git update-index --no-assume-unchanged assumeunchanged.txt
$ git checkout another-branch
Switched to branch 'another-branch'
4.2. Приоритет
--skip-worktree
имеет приоритет над -- предполагается неизмененным
битом, когда установлены оба. Попробуем установить обе опции в файле:
$ git update-index --assume-unchanged --skip-work-tree worktree-assumeunchanged.txt
Статус файла подтверждает приоритет skip-workkree
:
$ git ls-files -v
$ S worktree-assumeunchanged.txt
5. Вывод
В этой статье мы обсудили разницу в использовании параметров Git — accept- untchanged
и — skip-worktree
. Мы также обсудили их приоритет и то, как они взаимодействуют с локальными и восходящими ветвями.