В чем разница между добавлением bin
, bin/
, bin/*
и bin/**
в моем файле .gitignore? Я использовал bin/
, но, глядя на другие файлы .gitignore (в файле eclipse двойная и одинарная звезда даже используются вместе, вот так: tmp/**/*
что с этим?), Я вижу, что первые два шаблона также широко используются. Может кто-нибудь объяснить различия между тремя?
89
**
: stackoverflow.com/questions/1470572/…Ответы:
bin
соответствует любым файлам или каталогам с именем bin.bin/
соответствует любым каталогам с именем bin, что фактически означает все его содержимое, поскольку Git не отслеживает только каталоги.bin/*
соответствует всем файлам и каталогам прямо в любомbin/
. Это не позволяет Git автоматически находить какие-либо файлы в своих подкаталогах, но если, скажем, создаетсяbin/foo
подкаталог, это правило не будет соответствоватьfoo
содержимому.bin/**
соответствует всем файлам и каталогам в любомbin/
каталоге и всех его подкаталогах.Слово «любой» здесь имеет решающее значение, поскольку правила не относятся к корню репозитория и применяются в любом месте дерева файловой системы. Вы должны начинать правила с
/
(или!/
отменять игнорирование), что означает корень репозитория, а не корень системы, чтобы соответствовать только тому, что было задумано.ПРЕДУПРЕЖДЕНИЕ. Никогда не следует использовать только такие правила, как
dir/*
,/dir/**
и т. Д., Если вы также не отмените игнорирование того, что существует внутри этого каталога . Опустить звездочка или вы можете навсегда потерять много данных из некоторых призыванийgit gc
,git stash
и многое другое.Я действительно не знаю, что
tmp/**/*
мне делать. Сначала я думал, что его можно использовать для сопоставления файлов в подкаталогах,tmp/
но не для файлов, непосредственно присутствующих вtmp/
себе. Но простой тест, кажется, предполагает, что он игнорирует все файлы вtmp/
.источник
bin/
иbin/**
?bin/
, что каталог bin будет игнорироваться, ноbin/**
будет включать каталог bin, но не его содержимоеbin/
будет игнорировать сам каталог (включая все подкаталоги и файлы), тогда какbin/**
будет игнорировать все файлы в каталоге bin и его подкаталогах, но не сам каталог bin. Точно это или нет, я не уверен.bin/** \n !bin/*
(поскольку я не вижу, как принудительноbin
соответствует как названному файлу, такbin
и содержимомуbin
папки. В-третьих,bin/*
соответствует любым файлам в своих подкаталогах. Ребята, вы вообще это тестировали?bin
иbin/
отличаются только тем, что последний будет соответствовать только каталогу.bin/**/*
совпадает сbin/**
(очевидно, начиная с 1.8.2, согласно ответу @VonC).Сложность заключается в том, что я только что потратил час или около того на то, чтобы вырвать себе волосы,
bin/
иbin/**
это не совсем то же самое! Поскольку более ранний игнорирует каталог в целом, а последний игнорирует каждый из файлов в нем, а git почти во всех случаях не заботится о каталогах, обычно нет никакой разницы. Однако, если вы попытаетесь использовать!
для отмены игнорирования подпути, вы обнаружите, что git (кхм) игнорирует его, если вы проигнорировали родительский каталог! (опять же, а не содержимое каталога)Это наиболее ясно из примера, поэтому для недавно созданного репозитория, настроенного так:
Существуют следующие неотслеживаемые файлы:
Но вы можете видеть, что следующие файлы не игнорируются:
А если попробовать добавить, получится:
Я считаю такое поведение ошибкой. (Это все включено
git version 1.8.4.msysgit.0
)источник
dir/
иdir/**
re. отмену игнорирования с помощью!
происходит потому, что «невозможно повторно включить файл, если родительский каталог этого файла исключен» [источник ]. Непонятно, но сделано из соображений производительности. См. Связанный вопрос SO .Обратите внимание, что, строго говоря, git отслеживает не каталоги, а только файлы. Следовательно, невозможно добавить каталог, только его содержимое .
Однако в контексте
.gitignore
git делает вид, что понимает каталоги по той единственной причине, чтоЧто это означает для шаблонов исключения? Давайте рассмотрим их подробно:
bin
Это игнорирует
bin
.bin
Вы можете занести в белый список игнорируемые
bin
файлы и папки, добавляя последующие!
записи, но вы не можете добавить в белый список содержимое папок с именемbin
bin/
То же, что и выше, за исключением того, что не соответствует файлам с именем
bin
. Добавление завершающего/
указывает git на соответствие только каталогам.bin/*
Это игнорирует
bin
bin
bin/**
Это игнорирует
bin
bin
источник
Я только что сделал новое репо и кое-что попробовал. Вот мои результаты:
НОВЫЕ РЕЗУЛЬТАТЫ
git версия 2.10.1.windows.1
bin
каталог на несколько уровнейbin.txt
Test.txt
bin/a/b/bin.txt
bin/a/b/Test.txt
bin/a/bin/bin.txt
bin/a/bin/Test.txt
bin/a/bin.txt
bin/a/Test.txt
bin/bin.txt
bin/Test.txt
bin
в gitignore: Результатыbin
каталога (и глубже), теперь игнорируетсяbin
чтобыbin/
в gitignore: Результатыbin/
наbin/*
bin/*
наbin/**
bin/**
наbin/**/
bin/bin.txt
иbin/Test.txt
больше не игнорируютсяbin/**/
наbin/**/*
bin/bin.txt
иbin/Test.txt
снова игнорируютсяСТАРЫЕ РЕЗУЛЬТАТЫ
версия git: 2.7.0.windows.1
bin
каталог на несколько уровнейbin/a/b/Test.txt
bin/a/bin/Test.txt
bin/a/Test.txt
bin/Test.txt
bin
в gitignore: Результатыbin
каталога (и глубже), теперь игнорируетсяbin
чтобыbin/
в gitignore: Результатыbin
каталога (и глубже), по-прежнему игнорируется (без изменений)bin/
наbin/*
bin
каталога (и глубже), по-прежнему игнорируется (без изменений)bin/*
наbin/**
bin
каталога (и глубже), по-прежнему игнорируется (без изменений)bin/**
наbin/**/
bin/Test.txt
больше не игнорируетсяbin/**/
наbin/**/*
bin
каталога (и глубже), снова игнорируетсяисточник
Обратите внимание, что '
**
' в сочетании с подкаталогом (**/bar
) должно быть изменено по сравнению с его поведением по умолчанию, поскольку в примечании к выпуску для git1.8.2 теперь упоминается:Правило, которое следует запомнить (и которое помогает понять разницу намерений, стоящих за этим синтаксисом):
Невозможно повторно включить файл, если родительский каталог этого файла исключен.
Обычно, если вы хотите исключить файлы из подпапки игнорируемой папки f, вы должны сделать:
То есть:
f/
, папкаf/
игнорировалась бы, и правила , указанные нижеf
, не имели бы значения.f/**
добиться того жеf/
, но игнорировать все вложенные элементы (файлы и вложенные папки).Это дает возможность белый список (исключить из gitignore) подпапки:
!f/**/
.f
подпапки не игнорируются, вы можете добавить правило для исключения файла (!f/a/sub/folder/someFile.txt
)источник
Есть еще одно различие между
bin/*
иbin/
.bin/
совпадаетfoo/bin/test.txt
(как и ожидалось), ноbin/*
нет, что кажется странным, но задокументировано: https://git-scm.com/docs/gitignoreПричина этого, похоже, заключается в следующих правилах:
Поэтому, если шаблон заканчивается косой чертой, косая черта удаляется и обрабатывается как шаблон оболочки оболочки, и в этом случае
bin
совпадаетfoo/bin/test.txt
. Если он заканчивается на/*
, косая черта не удаляется, а передается в fnmatch, что не соответствует в подкаталогах.Однако то же самое не относится к
foo/bin/
иfoo/bin/*
, поскольку даже после удаления завершающей косой чертыfoo/bin/
он все еще содержит косую черту, поэтому он рассматривается как шаблон fnmatch, а не глобус. Т.е. не будет совпадатьbar/foo/bin/test.txt
источник