Как сказал Возраст Обсидиана , он применяется к файлам в поддереве с корнем в той точке, в которой появляется файл .gitignore
.
A .gitignore
file должен отслеживаться 1 (т. е. должен присутствовать в индексе) и, следовательно, существовать как копия в каждом коммите. Это означает, что каждый коммит имеет свою собственную .gitignore
копию . 2 Если вы находитесь на branch-1
, а вы git checkout branch-2
, и это выдает другую Файл .gitignore
, его содержимое теперь применяются к папке и подпапкам. Если затем вы git checkout branch-1
вернете branch-1
файлы, включая branch-1
версию .gitignore
, , то содержимое теперь применимо.
1 Это не сложное требование, но не фиксация файла .gitignore
означает, что вам, вероятно, вообще не следует использовать файл .gitignore
. Вы можете получить аналогичный эффект, создав глобальный gitignore (для себя) или файл .git/info/excludes
для этого одного хранилища.
2 Как и для всех отслеживаемых и подтвержденных файлов, Git разделяет любой файл, который точно совпадает. Это может быть сделано, потому что каждый файл фиксации навсегда заморожен в этой конкретной формы, в этом конкретном коммите . Его нельзя изменить, поэтому он может быть общим .
То есть предположим, что вы git checkout master
создаете файл размером 10 мегабайт с именем big
запустите git add big
, а затем git commit
. Теперь вы создали новый файл размером 10 МБ, который находится в только что сделанном вами коммите. Каждый коммит, который вы делаете после этой точки, также содержит файл размером 10 МБ, вплоть до git rm big
, чтобы удалить его из дерева индексов и работы и сделать все будущие коммиты неУ есть файл. 3 Но каждый файл, который разделяет точную версию большого файла, использует одну единственную общую копию. Поэтому, если у вас есть четыре тысячи коммитов, но все они имеют только один конкретный файл big
, у вас есть только 10 МБ big
, а не 4000 * 10 МБ.
3 Или, конечно, вы можете перезаписать big
крошечным содержимым. Сделанный вами next коммит будет иметь небольшой файл с именем big
, который будет использоваться совместно с каждым будущим коммитом, точно так же, как большой файл с именем big
передается с каждым будущим коммитом до этого момента.
Если это слишком запутанно, просто представьте, что Git автоматически выполняет процедуру дедупликации «посмотрите, были ли эти данные когда-либо зафиксированы до», каждый раз, когда вы git add
делаете файл. Если это действительно когда-либо было зафиксировано ранее, Git автоматически повторно использует уже замороженную копию.