Помните, что .gitignore
на самом деле не означает игнорировать . В основном это означает, что не жалуйтесь на неотслеживаемые файлы.
Файлы отслеживаются , если и только если они находятся в Git's index . Содержимое индекса со временем меняется - изначально оно «независимо от того, что было в коммите, который вы только что извлекли», но вы можете заменить находящиеся в нем файлы или поместить в него новые git add
, и вы можете удалите файлы из него с помощью git rm
(или, в этом отношении, с git add
!). Если файл отслеживается , т. Е. Если имя этого файла находится в индексе прямо сейчас , то любое совпадение имени этого файла с любой записью .gitignore
не имеет значения.
Отслеживаются только файлы . Из-за этого факта, запись .gitignore
для каталога, ну, странно. Каталог никогда не будет отслеживаться. Эффект имени каталога в .gitignore
, соответственно, особенно странный и хитрый.
Внутренняя, ориентированная на производительность цель - игнорировать весь каталог в Git не столько для того, чтобы упростить процесс выражения пользователем, сколько для того, чтобы заставить Git работать очень быстро, как гоночный автомобиль, который вы можете использовать. проехать 700 миль в час по обрыву! "
Одна из более медленных частей Git - перечисление, по одному файлу за раз, каждому файлу и подкаталогу, а также файлам всех подкаталогов в некотором каталоге, потому что Git должен постоянно спрашивать ОС, по одному файлу за раз, около каждого из этих файлов (сделать lstat
системных вызовов). Люди из Git заметили, что если бы вы могли как-то сказать Git: даже не заглянуть внутрь каталог vendor
, вы могли бы пропустить тысячи файлов SDK, которые вы вставили в там, делая git status
так намного быстрее.
С этой целью, если вы укажете vendor
или vendor/
(или /vendor/
для корня шаблона в каталоге, содержащем файл .gitignore
), и Индекс Git имеет в нем нет файлов с именем vendor/<em>anything</em>
, , затем - и только тогда - Git может пропустить прямо по каталогу vendor
и не потрудиться перечислять тысячи файлов SDK.
На другомС другой стороны, если вы перечислите vendor/*
или /vendor/*
- оба из них означают одно и то же, поскольку оба содержат /
, который не является окончательным /
- Git придется открывать и читать каталог vendor
. Независимо от того, находятся ли все десять тысяч файлов (и / или подкаталогов) на верхнем уровне этого каталога, Git сможет их пропустить - в конце концов, они соответствуют vendor/*
- но сначала ему нужно будет перечислить по крайней мере, верхний уровень каталога vendor
. Этот процесс перечисления дает вам возможность затем un - игнорировать любой конкретный подкаталог или файл, такой как vendor/REMEMBER_WHICH_VERSION_WE_GOT
(хотя, вероятно, лучше помнить, что за пределами субподрядчика поставщика дерево).
(Обратите внимание, что, если в каком-то каталоге есть отслеживаемый файл, Git обязан заглянуть внутрь этого каталога, даже если каталог номинально игнорируется. Так что этот make-the-race-car-go-fast-even-if- Трюк "есть скала рядом" применяется только тогда, когда там нет отслеживаемых файлов, то есть, принудительное отслеживание файла в Git также гарантирует, что в этой довольно запутанной аналогии также нет обрыва.)