Ключевое отличие в том, что build64
не имеет косой черты.
Я знаю, что вы на самом деле написали build64/
и build64/*
, а build64/
имеет косая черта в нем, но build64
не имеет косой черты в этом, и вот что имеет значение.
Посмотрите на документацию gitignore иотсканируйте раздел, озаглавленный ФОРМАТ ШАБЛОНА .Обратите внимание на точку с маркером, которая начинается с:
- Если шаблон заканчивается косой чертой, он удаляется с целью следующего описания ...
Остальная часть текста, я думаю, очень сбивает с толку - слишком сбивает с толку - но ключ здесь в том, что у build64/
сначала удаляется завершающий слеш, так что у него нет слешав этом больше нет.Так что сейчас , если Git встречает файл с именем test/test/build64/ALL_BUILD.vcxproj
, Git разбивает это имя на четыре компонента имени файла , а именно:
test
(первый test
в test/test
); test
(второй test
в test/test
); build64
;и ALL_BUILD.vcxproj
.
Соответствует ли какой-либо из этих четырех компонентов build64
?Почему да, третий компонент соответствует build64
.Оригинальный build64
имел косую черту, так что это компонент имя каталога , а не имя файла?Да, это так: test/test/build64/ALL_BUILD.vcxproj
игнорируется правилом build64/
, которое не содержит косую черту, за исключением той конечной косой черты, которая не считается.
С другой стороны, если вы пишете build64/*
, Git не не удаляет косую черту, поэтому шаблон включает косую черту.Git разбивает полное имя test/test/build64/ALL_BUILD.vcxproj
точно так же, как и раньше, но на этот раз требуется, чтобы все эти компоненты имени соответствовали шаблону complete .Совпадают ли все четыре названных компонентов build64/*
?Ну, build64/*
начинается с build64
, а первый компонент имени test
.Это не соответствует , поэтому совпадение в целом сразу же завершается неудачей.
Обратите внимание, что если бы вы написали test/test/build64/*
в качестве строки .gitignore
, Git сопоставил бы test/test/build64/ALL_BUILD.vcxproj
с test/test/build64/*
.Теперь первый компонент test
должен соответствовать test
- он соответствует - и второй компонент также должен соответствовать test
, что, конечно же, также.Третий компонент должен соответствовать build64
, а последний компонент ALL_BUILD.vcxproj
должен соответствовать *
.Все эти требования выполнены, поэтому выберет файл, чтобы Git заткнулся о неотслеживаемости.
Вы также можете написать **/build64/*
, потому что **
соответствует любое количество ведущих компонентов.Это будет соответствовать полному имени test/test/build64/ALL_BUILD.vcxproj
, но также build64/file
, fred/build64/wilma
и fred/wilma/build64/betty
.Обратите внимание, что он будет не соответствовать fred/wilma/build64/barney/betty
, потому что barney/betty
имеет слишком много компонентов - но если вы сопоставите каталог fred/wilma/build64/barney
, Git может никогда не потрудиться посмотреть внутри fred/wilma/build64/barney/
чтобы найти betty
в любом случае.
В любом случае важно помнить, что сопоставление в стиле оболочки выполняется по одному компоненту имени файла за один раз , за исключением совпадений **
.Правило «все должны совпадать» запускается шаблоном gitignore, который включает в себя встроенную косую черту;в противном случае должен совпадать только один компонент.Конечные косые черты, как почти сказано в документации,
удалены с целью
решить, использовать ли «все должны совпадать» или «только один должен совпадать»править.