Мерзавец игнорировать против исключить против предположить без изменений
Я прочитал документы по этому вопросу несколько раз, и до сих пор не до конца понял различия между этими различными командами. Может быть, это только я, но документация может быть более ясной:
http://git-scm.com/docs/gitignore
https://help.github.com/articles/ignoring-files
Более того, во многих комментариях на эту тему, похоже, используются слова "проиндексированный", "зафиксированный", "отслеживаемый" несколько свободно, что делает различия между этими тремя менее понятными.
Мое текущее (по общему признанию ограниченное) понимание:
Файлы совпадают в
.gitignore
не будет отслеживаться в будущем. (Хотя они могли быть отслежены ранее.) Это означает, что они никогда не появятся в будущемgit status
список как изменился.Однако будущие изменения все равно будут синхронизироваться с удаленными репозиториями. Другими словами, файлы по-прежнему "индексируются", но они не "отслеживаются". Потому что.gitignore
файл находится в каталоге проекта, сам файл может быть версионным.Файлы совпадают в
.git/info/exclude
также не будет "отслеживаться". Кроме того, эти файлы никогда не будут синхронизированы удаленно и, следовательно, никогда не будут видны другим пользователям. Эти файлы должны быть файлами, относящимися к редактору или рабочему процессу отдельного пользователя. Потому что это в.git
каталог,exclude
Сам файл не может быть версионным.Файлы, которые имели
assume-unchanged
беги на них и не показывайся вgit status
или жеgit diff
, Это похоже наexclude
в том, что эти файлы не "проиндексированы" и не "отслежены". Тем не менее, последняя версия файла, которая будет передана доassume-unchanged
останется видимым для всех пользователей в репо.
Мои вопросы:
Является ли приведенная выше интерпретация правильной? Пожалуйста, поправьте меня.
Если файл уже был в коммите, чем отличается функционал при сопоставлении его в
.exclude
и работаетassume-unchanged
в теме? Почему один предпочитает один подход к другому?Мой основной вариант использования состоит в том, что я хочу избежать сортировки различий в скомпилированных файлах, но я все же хочу, чтобы эти скомпилированные файлы синхронизировались вместе с исходными файлами. Будет
gitignore
файл все еще будет выдвинут? Если нет, как управлять окончательным развертыванием скомпилированных файлов?
Заранее благодарю за любую помощь.
4 ответа
Я приму этот ответ по электронной почте от Джунио Хамано (сопровождающего Git), потому что я думаю, что он объясняет некоторые вещи более доходчиво, чем официальные документы, и его можно принять за "официальный" совет:
.Gitignore и.git / info / exclude являются двумя пользовательскими интерфейсами для вызова одного и того же механизма. In-tree.gitignore должны быть разделены между участниками проекта (т. Е. Каждый, кто работает над проектом, должен рассматривать пути, которые соответствуют шаблону игнорирования в нем, как грубость). С другой стороны,.git / info / exclude предназначен для личных шаблонов игнорирования (т. Е. Вы, работая над проектом, считаете их бесполезными).
Предположим, что без изменений нельзя злоупотреблять механизмом игнорирования. Это "Я знаю, что моя файловая система работает медленно. Я обещаю Git, что я не буду менять эти пути, делая их с этим битом - таким образом, Git не должен проверять, менял ли я там каждый раз Я прошу вывод "git status". Это не означает ничего, кроме этого. В частности, Git не обещает, что Git всегда будет считать, что эти пути не изменены - если Git может определить путь, помеченный как предполагаемый неизмененный, без дополнительных затрат lstat(2), он оставляет за собой право сообщить, что путь был изменен (в результате "git commit -a" может зафиксировать это изменение).
В дополнение к ответу Хунио Хамано, Git 2.3.0 (февраль 2015) теперь удаляется из gitignore
документация
Чтобы игнорировать незафиксированные изменения в файле, который уже отслежен, используйте 'git update-index --assume-unchanged
".
Смотрите коммит 936d2c9 от Майкла Дж. Грубера ( mjg
):
gitignore.txt
: не предлагатьassume-unchanged
git-update-index --assume-unchanged
никогда не предназначался для игнорирования изменений в отслеживаемых файлах (только для экономии некоторой статистики).
Так что не предлагайте это как средство для достижения этого.
Надеемся, что не слишком много источников информации используют отслеживаемые, проиндексированные и зафиксированные свободно, поскольку все они разные и значимые.
- Индексированный означает, что файл находится в индексе git. В какой-то момент в прошлом кто-то использовал
git add
или эквивалентная команда в файле. Файл отслеживается и также может быть зафиксирован. - Tracked означает, что git просматривает файл на предмет изменений. Любой зафиксированный файл или любой файл в индексе отслеживается.
- Committed означает, что файл находится в истории git. Для этого файла есть хотя бы одна контрольная точка; Вы можете вернуться к любой подтвержденной версии файла.
Теперь до предела моих собственных знаний. Я не уверен в этом определении, но это мое понимание; с радостью исправлюсь по этому поводу:
когда индексируемый файл фиксируется, его больше нет в индексе. В следующий раз, когда он будет изменен (или удален), он вернется в индекс. Индекс представляет собой сумму всех отслеживаемых файлов, которые отличаются от зафиксированных.
Индекс также называется кеш или промежуточная область.
На ваш главный вопрос..git / info / exclude - это то же самое, что и.gitignore, только более низкий приоритет, а не в хранилище (то есть, не зафиксировано и не передано). Ни один из них не влияет на уже отслеженные файлы. Оба влияют на файлы, которые в настоящее время не отслеживаются. Обновление.gitignore после git add
или же git commit
слишком поздно; git уже отслеживает файл, и.gitignore не повлияет на это.
Предполагается, что без изменений влияет только на отслеживаемые файлы, и, таким образом, он полностью отделен от.gitignore. Он может временно делать вид, что файл не отслежен и игнорируется (но это не обязательно, и он также не может делать ничего, отличного от нормального поведения). Как упоминают другие ответы, это не используется для игнорирования изменений в файлах, просто для того, чтобы потенциально избежать операций файловой системы на медленных файловых системах.
Re: пункт 3: вы не должны добавлять скомпилированные файлы в git. Скомпилируйте ваши файлы в другой каталог, в котором находится ваш источник, и игнорируйте весь этот каталог. Соберите свои скомпилированные файлы в библиотеку и добавьте их в хранилище артефактов, но не помещайте их в git.
Я думаю, что разница.gitignore и предположить, что без изменений
.gitignore может использоваться совместно с другими людьми в команде, но предполагается, что неизменное должно быть настроено для каждого участника индивидуально.
Предположим, неизменными являются отслеживаемые файлы. Это очень полезно, если файл содержит информацию о конфигурации, но может быть изменен командой. Если файл установлен как предполагаемый неизменный, но изменен другими людьми и отправлен в удаленный репозиторий, git будет напоминать при попытке извлечь из удаленного.