Примечание: fallengamer провел несколько тестов в 2011 году (поэтому они могут быть устаревшими), и вот его выводы :
операции
- Файл изменяется как в локальном репозитории, так и в апстриме
git pull
:
Git сохраняет локальные изменения в любом случае.
Таким образом, вы случайно не потеряете данные, помеченные любым из флагов.
- Файл с
assume-unchanged
флагом: Git не будет перезаписывать локальный файл. Вместо этого он будет выводить конфликты и советы, как их разрешать
- Файл с
skip-worktree
флагом: Git не будет перезаписывать локальный файл. Вместо этого он будет выводить конфликты и советы, как их разрешать
- Файл изменяется как в локальном репозитории, так и в восходящем потоке, все равно пытаясь извлечь.
Используя результаты в некоторой дополнительной ручной работе, но, по крайней мере, вы не потеряете данные, если у вас будут локальные изменения.
git stash
git pull
skip-worktree
- Файл с
assume-unchanged
флагом: Отменяет все локальные изменения без возможности их восстановления. Эффект похож на ' git reset --hard
'. ' git pull
' вызов будет успешным
- Файл с
skip-worktree
флагом: Stash не будет работать с skip-worktree
файлами. ' git pull
' потерпит неудачу с той же ошибкой, что и выше. Разработчик вынужден вручную сбросить skip-worktree
флаг, чтобы иметь возможность скрыть и завершить сбой pull
.
- Локальных изменений нет, файл исходных данных изменен
Оба флага не помешают вам получить входящие изменения. Git обнаруживает, что вы нарушили обещание, и пытается отразить реальность, сбросив флаг.
git pull
assume-unchanged
- Файл с
assume-unchanged
флагом: содержимое обновлено, флаг утерян.
' git ls-files -v
' показывает, что флаг изменен на H
(с h
).
- Файл с
skip-worktree
флагом: содержимое обновлено, флаг сохранен.
' git ls-files -v
' будет показывать тот же S
флаг, что и до pull
.
- При изменении локального файла
Git не трогает файл и отражает реальность (файл, обещанный неизменным, фактически был изменен) для файла.
git reset --hard
skip-worktree
assume-unchanged
- Файл с
assume-unchanged
флагом: содержимое файла обращено. Флаг сбрасывается на H
(с h
).
- Файл с
skip-worktree
флагом: содержимое файла не повреждено. Флаг остается прежним.
Он добавляет следующий анализ:
Похоже , что skip-worktree
это очень старается сохранить свои локальные данные . Но это не мешает вам вносить изменения, если это безопасно. Плюс git не сбрасывает флаг pull
.
Но игнорирование команды ' reset --hard
' может стать неприятным сюрпризом для разработчика.
Assume-unchanged
флаг может быть утерян во время pull
операции, и локальные изменения внутри таких файлов не кажутся важными для git.
Видеть:
Он делает вывод:
На самом деле ни один из флагов не является достаточно интуитивным .
assume-unchanged
Предполагается, что разработчик не должен изменять файл. Если файл был изменен - тогда это изменение не важно. Этот флаг предназначен для повышения производительности для неизменяемых папок, таких как SDK.
Но если обещание нарушено и файл фактически изменен, git возвращает флаг, чтобы отразить реальность. Вероятно, все-таки есть несколько несовместимых флагов в папках, которые обычно не предназначены для изменения.
С другой стороны skip-worktree
, полезно, когда вы указываете git не трогать определенный файл. Это полезно для уже отслеженного файла конфигурации.
Основной основной репозиторий содержит несколько готовых конфигураций, но вы хотели бы изменить некоторые параметры в конфигурации, чтобы иметь возможность проводить локальное тестирование. И вы не хотите случайно проверять изменения в таком файле, чтобы повлиять на производственный конфиг. В таком случае skip-worktree
делает идеальную сцену.
С Git 2.25.1 (февраль 2020 г.), «фактически ни один из флагов не является достаточно интуитивным», упомянутое выше, дополнительно разъясняется:
См. Коммит 7a2dc95 , коммит 1b13e90 (22 января 2020 г.) от Брайана М. Карлсон ( bk2204
) .
(Слиты Junio C Hamano - gitster
- в фиксации 53a8329 , 30 Jan 2020)
( Git список рассылки )
doc
: отговорить пользователей от попыток игнорировать отслеживаемые файлы
Подписано: Джефф Кинг
Подписано: Брайан М. Карлсон
Пользователи часто хотят игнорировать изменения в файле, который отслеживает Git.
Распространенными сценариями для этого случая являются настройки и файлы конфигурации IDE, которые, как правило, не должны отслеживаться и, возможно, генерироваться из отслеживаемых файлов с использованием механизма шаблонов.
Тем не менее, пользователи узнают о предполагаемых неизменяемых битах и битах пропуска рабочего дерева и в любом случае пытаются использовать их для этого.
Это проблематично, потому что, когда эти биты установлены, многие операции ведут себя так, как ожидает пользователь, но они обычно не помогают, когда git checkout
необходимо заменить файл.
В этом случае нет разумного поведения, потому что иногда данные являются ценными, например, определенные файлы конфигурации, а иногда это не относящиеся к делу данные, которые пользователь с удовольствием отбросит.
Поскольку это не поддерживаемая конфигурация, и пользователи склонны злоупотреблять существующими функциями в непреднамеренных целях, вызывая общую печаль и замешательство , давайте задокументируем существующее поведение и подводные камни в документации, git update-index
чтобы пользователи знали, что им следует изучить альтернативные решения.
Кроме того, давайте предложим рекомендованное решение для работы с обычным случаем файлов конфигурации, поскольку во многих средах успешно используются известные подходы.
Страница git update-index
man теперь включает в себя:
Пользователи часто пытаются использовать assume-unchanged
и skip-worktree
биты сказать Git игнорировать изменения в файлы, которые отслеживаются. Это не работает должным образом, так как Git может по-прежнему проверять файлы рабочего дерева по индексу при выполнении определенных операций. В общем, Git не предоставляет способ игнорировать изменения отслеживаемых файлов, поэтому рекомендуются альтернативные решения.
Например, если файл, который вы хотите изменить, представляет собой файл конфигурации, репозиторий может содержать пример файла конфигурации, который затем можно скопировать в игнорируемое имя и изменить. Хранилище может даже включать скрипт для обработки файла примера как шаблона, автоматически изменяющего и копирующего его.
Эта последняя часть - то, что я описываю типичный драйвер фильтра контента, основанный на нечетких / чистых скриптах .
.gitignore
для подобных целей. Будет ли это решение работать на вас?