.gitignore В чем разница между subdir / * и subdir /? - PullRequest
0 голосов
/ 16 сентября 2018
test/test/build64/ALL_BUILD.vcxproj

Файл выше игнорируется с использованием следующего шаблона:

build64/ 

Но приведенный ниже шаблон не работает.

build64/*

1 Ответ

0 голосов
/ 16 сентября 2018

Ключевое отличие в том, что 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, который включает в себя встроенную косую черту;в противном случае должен совпадать только один компонент.Конечные косые черты, как почти сказано в документации,

удалены с целью

решить, использовать ли «все должны совпадать» или «только один должен совпадать»править.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...