У меня есть локальные изменения в файле, которые я не хочу фиксировать в своем хранилище. Это файл конфигурации для сборки приложения на сервере, но я хочу собрать локально с другими настройками. Естественно, файл всегда отображается, когда я делаю «git status», как что-то, что нужно поставить. Я хотел бы скрыть это конкретное изменение, а не совершать его. Я не буду вносить другие изменения в файл.
После нескольких копаний я вижу 2 варианта: «предположить, без изменений» и «пропустить рабочее дерево». Предыдущий вопрос здесь говорит о них, но на самом деле не объясняет их различия. У меня такой вопрос: чем отличаются две команды? Зачем кому-то использовать один или другой?
.gitignore
для подобных целей. Будет ли это решение работать на вас?Ответы:
Вы хотите
skip-worktree
.assume-unchanged
предназначен для случаев, когда стоит проверить, была ли изменена группа файлов; когда вы устанавливаете бит,git
(конечно) предполагается, что файлы, соответствующие этой части индекса, не были изменены в рабочей копии. Таким образом, это позволяет избежать беспорядкаstat
звонков. Этот бит теряется всякий раз, когда изменяется запись файла в индексе (то есть, когда файл изменяется в восходящем направлении).skip-worktree
это нечто большее: даже еслиgit
известно, что файл был изменен (или должен быть изменен с помощьюreset --hard
или тому подобное), он будет делать вид, что не изменял, используя вместо этого версию из индекса. Это сохраняется до тех пор, пока индекс не будет отброшен.Хорошее резюме последствий этой разницы и типичных случаев использования здесь: http://fallengamer.livejournal.com/93321.html .
Из этой статьи:
--assume-unchanged
Предполагается, что разработчик не должен изменять файл. Этот флаг предназначен для повышения производительности для неизменяемых папок, таких как SDK.--skip-worktree
полезно, когда вы указываете git не трогать определенный файл, потому что разработчики должны изменить его. Например, если основной основной репозиторий содержит несколько готовых файлов конфигурации и вы не хотите случайно вносить изменения в эти файлы,--skip-worktree
это именно то, что вам нужно.источник
--skip-worktree
эффектов и снятия флажка есть--no-skip-worktree
опция. Работает точно так же. Это полезно, если рука поскользнулась и были помечены неправильные файлы, или если обстоятельства изменились и ранее пропущенные файлы больше не должны игнорироваться.--skip-worktree
и.git/info/exclude
файлом заключается в том, что первый будет работать даже для файлов, которые в настоящее время отслеживаются. Точно.git/info/exclude
так же.gitignore
будет предотвращать только случайное добавление неотслеживаемых файлов в индекс, но не вносить изменения в файлы, которые уже отслеживаются.--skip-worktree
и--assume-unchanged
не позволяют переключиться на другую ветку. Я получаю ошибку:Your local changes to the following files would be overwritten by checkout
. Подробности здесьgit update-index --skip-worktree <file_name>
Примечание: 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 pull
assume-unchanged
assume-unchanged
флагом: содержимое обновлено, флаг утерян.'
git ls-files -v
' показывает, что флаг изменен наH
(сh
).skip-worktree
флагом: содержимое обновлено, флаг сохранен.'
git ls-files -v
' будет показывать тот жеS
флаг, что и доpull
.git reset --hard
skip-worktree
assume-unchanged
assume-unchanged
флагом: содержимое файла обращено. Флаг сбрасывается наH
(сh
).skip-worktree
флагом: содержимое файла не повреждено. Флаг остается прежним.Он добавляет следующий анализ:
Похоже , что
skip-worktree
это очень старается сохранить свои локальные данные . Но это не мешает вам вносить изменения, если это безопасно. Плюс git не сбрасывает флагpull
.Но игнорирование команды '
reset --hard
' может стать неприятным сюрпризом для разработчика.Assume-unchanged
флаг может быть утерян во времяpull
операции, и локальные изменения внутри таких файлов не кажутся важными для git.Видеть:
Комментарий Junio (текущий сопровождающий git) о намерениях
assume-unchanged
,В частности, Junio указывает, что изменения в
assume-unchanged
файлах могут быть случайно зафиксированы: «если Git может определить путь, помеченный какassume-unchanged
измененный, без дополнительных затрат на lstat (2), он оставляет за собой право сообщить, что путь был изменен ( в результате можетеgit commit -a
свободно вносить эти изменения). "разница между
assume-unchanged
иskip-worktree
как обсуждалось в списке рассылки git при добавленииskip-worktree
патча .Он делает вывод:
На самом деле ни один из флагов не является достаточно интуитивным .
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 список рассылки )
Страница
git update-index
man теперь включает в себя:Эта последняя часть - то, что я описываю типичный драйвер фильтра контента, основанный на нечетких / чистых скриптах .
источник