Git игнорировать и исключать vs. принимать без изменений

Я читал документы в этом несколько раз, и я до сих пор не полностью понимаю различия между этими разными командами. Может быть, это только я, но документация может быть более ясной:

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 на нем? Почему бы вам предпочесть один подход к другой?

  • Мой основной вариант использования заключается в том, что я хочу избежать сортировки через diff на скомпилированные файлы, но я все же хочу, чтобы эти скомпилированные файлы синхронизировались с исходными файлами. Будет ли файл gitignore 'd еще нажат? Если нет, как управлять окончательным развертыванием скомпилированных файлов?

Заранее благодарим за помощь.

Ответ 1

Я собираюсь принять этот ответ по электронной почте от Junio ​​Hamano (сопровождающий Git), потому что я думаю, что он объясняет некоторые вещи более ясными, чем официальные документы, и это может быть принято как "официальный" совет:

.gitignore и .git/info/exclude - это два пользовательских интерфейса для вызова такой же механизм. В-дерево .gitignore должны использоваться совместно членов (т.е. все, кто работает над проектом, должны рассмотреть пути, которые соответствуют шаблону игнорирования там, как треск). С другой hand,.git/info/exclude предназначено для персональных шаблонов игнорирования (т. вы, работая над проектом, считаете их крутыми).

Предположим, что без изменений не следует злоупотреблять механизмом игнорирования. это "Я знаю, что мои операции с файловой системой медленные. Я обещаю Git, что я не изменят эти пути, сделав их с этим битом --- таким образом, Gitне нужно проверять, менял ли я каждый раз, когда я спрашиваю для 'git status' output". Это не означает ничего, кроме этого. В частности, это не обещание Git, что Git всегда будет учитывать эти пути немодифицированы --- если Git может определить путь, который отмеченный как предполагаемый-неизменный, изменился без дополнительных lstat (2) стоит, он оставляет за собой право сообщать, что путь (в результате "git commit -a" может свободно совершить это изменение).

Ответ 2

Добавление к Junio ​​Hamano answer, Git 2.3.0 (февраль 2015) теперь удаляет из gitignore

Чтобы игнорировать незафиксированные изменения в файле, который уже отслеживается, используйте 'git update-index --assume-unchanged'.

См. совершить 936d2c9 из Michael J Gruber (mjg):

gitignore.txt: не предлагайте assume-unchanged

git-update-index --assume-unchanged никогда не означало игнорировать изменения в отслеживаемых файлах (только для сохранения некоторых характеристик).
Поэтому не предлагайте это как средство достижения этого.

Ответ 3

Надеемся, что не так много источников информации используют отслеживаемые, индексированные и допущенные свободно, поскольку они все разные и значимые.

  • Индексированный означает, что файл находится в индексе git. В какой-то момент в прошлом кто-то использовал git add или эквивалентную команду в файле. Файл отслеживается и может также быть зафиксирован.
  • Отслеживание означает, что git просматривает файл для изменений. Отслеживается любой зафиксированный файл или любой файл в индексе.
  • Committed означает, что файл находится в истории git. Для этого файла есть хотя бы одна контрольная точка; вы можете вернуться к любой зафиксированной версии файла.

Теперь до предела моих собственных знаний. Я не уверен в этом определении, но это мое понимание; счастлив быть исправленным об этом:

когда индексированный файл зафиксирован, он больше не находится в индексе. В следующий раз, когда он будет изменен (или удален), он вернется в индекс. Индекс представляет собой сумму всех отслеживаемых файлов, которые отличаются от того, что было совершено.

Индекс также называется кешем или промежуточной областью.

На ваш главный вопрос..git/info/exclude - это то же самое, что и .gitignore, только более низкий приоритет, а не в репозитории (поэтому он не передается и не делится). Не влияет на уже отслеживаемые файлы. Оба влияют на файлы, которые в настоящее время не отслеживаются. Обновление .gitignore после git add или git commit слишком поздно; git уже отслеживает файл, а .gitignore не влияет на это.

Предположим, что неизмененный влияет только на отслеживаемые файлы и, следовательно, полностью разделен на .gitignore. Он может временно притворяться, что файл не отслеживается и игнорируется (но он не имеет и не может ничего не отличать от обычного поведения). Как упоминают другие ответы, это не используется для игнорирования изменений в файлах, просто для потенциального предотвращения действий файловой системы в медленных файловых системах.

Re: пункт 3: вы не должны добавлять скомпилированные файлы в git. Скомпилируйте файлы в другой каталог, в котором находится ваш источник, и игнорируйте весь каталог. Свяжите свои скомпилированные файлы в библиотеке и добавьте их в репозиторий артефактов, но не помещайте их в git.

Ответ 4

Я думаю, что разница .gitignore и без изменений -

  • .gitignore может использоваться совместно с другими людьми в команде, но для каждого участника необходимо индивидуально настроить значение "без изменений".

  • Предполагать-неизменными являются отслеживаемые файлы. Это очень полезно, если файл имеет информацию о конфигурации, но может быть изменен командой. Если файл задан как принятый-неизменный, но измененный другими людьми и нажатый в удаленный репозиторий, git будет напоминать, когда попытайтесь вытащить с удаленного.