Перейти к основному содержимому

Разница между предположениями без изменений и пропуском рабочего дерева в Git

· 3 мин. чтения

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 . Мы также обсудили их приоритет и то, как они взаимодействуют с локальными и восходящими ветвями.