Разница в пути.файл gitignore?
Я использую git, но все еще испытываю путаницу в .gitignore пути к файлам.
Так, в чем разница между следующими двумя путями в .gitignore?
tmp/* public/documents/**/*
Я могу это понять tmp/* будет игнорировать все файлы и папки внутри него. Я прав?
Но что означает эта вторая линия пути?
6 ответов:
это зависит от поведения вашей оболочки. Git не делает никакой работы, чтобы определить, как их расширить. В общем,
*соответствует любому отдельному файлу или папке:/a/*/z matches /a/b/z matches /a/c/z doesn't match /a/b/c/z
**соответствует любой строке из папки:/a/**/z matches /a/b/z matches /a/b/c/z matches /a/b/c/d/e/f/g/h/i/z doesn't match /a/b/c/z/d.pr0nкомбината
**С*чтобы сопоставить файлы во всем дереве папок:/a/**/z/*.pr0n matches /a/b/c/z/d.pr0n matches /a/b/z/foo.pr0n doesn't match /a/b/z/bar.txt
если вы используете оболочку, такую как Bash 4, то ** по существу является рекурсивной версией*, которая будет соответствовать любому количеству подкаталогов.
это имеет больше смысла, если вы добавляете расширение файла в свои примеры. Чтобы сопоставить файлы журнала непосредственно внутри tmp, введите:
/tmp/*.logчтобы сопоставить файлы журнала в любом месте в любом подкаталоге tmp, вы должны ввести:
/tmp/**/*.logно тестирование с Git версии 1.6.0.4 и bash версии 3.2.17 (1)-релиз, это похоже, что git вообще не поддерживает ** глобусы. Элемент самая последняя страница man для gitignore не говоря уже о **, так что это либо (1) Новая (2) не поддерживается, или (3) как-то зависит от системы реализации подстановка.
кроме того, есть что-то тонкое происходит в ваших примерах. Это выражение:
tmp/*...на самом деле означает "игнорировать любой файл внутри каталог tmp, в любом месте исходного дерева, но не игнорируйте сами каталоги tmp". При нормальных обстоятельствах вы, вероятно, просто напишете:
/tmp...который будет игнорировать один каталог tmp верхнего уровня. Если вам нужно сохранить каталоги tmp, игнорируя их содержимое, вы должны поместить пустой .gitignore файл в каждом каталоге tmp, чтобы убедиться, что git на самом деле создает каталог.
Обновление (08-Mar-2016)
сегодня, я не могу найти машину, где
**не работает как заявлено. Это включает в себя OSX-10.11.3 (El Capitan) и Ubuntu-14.04.1 (Trusty). Возможно, git-игнорировать, как было обновлено, или, возможно, недавно fnmatch ручки**как люди ожидают. Таким образом, принятый ответ теперь кажется правильным на практике.
оригинальное сообщение
The
**не имеет особого значения в git. Это особенность bash >= 4.0, через
shopt -s globstarно git не использовать Баш. Чтобы увидеть, что git на самом деле, вы можете экспериментировать с
git add -nvи файлы в нескольких уровнях подкаталогов.для OP я пробовал каждую комбинацию, которую я могу придумать для и ничего не работает лучше, чем это:
public/documents/следующий не делает то, что все, кажется, думают:
public/documents/**/*.objЯ не могу заставить это работать независимо от того, что я пытаюсь, но по крайней мере это согласуется с git docs. Я подозреваю, что когда люди добавляют это к
.gitignore, он работает случайно, только потому, что их.objфайлы-это именно один вложенный каталог глубокое. Вероятно, они скопировали двойную звездочку из сценария bash. Но, возможно, есть системы, гдеfnmatch(3)может обрабатывать двойную звездочку, как bash может.
обратите внимание, что '
**',в сочетании с подкаталогом (**/bar), должно быть, изменилось его поведение по умолчанию, так как примечание к выпуску для git1.8. 2 теперь упоминает:шаблоны
.gitignoreи.gitattributesфайлы могут иметь**/, как шаблон, который соответствует 0 или более уровней подкаталога.например"
foo/**/bar" совпадает с "bar" в "foo" сам или в подкаталоге "foo".
посмотреть commit 4c251e5cb5c245ee3bb98c7cedbe944df93e45f4:
"
foo/**/bar" совпадает с "foo/x/bar","foo/x/y/bar"... но не "foo/bar".
Мы делаем особый случай, когдаfoo/**/обнаружен (и "foo/"часть уже сопоставлена), попробуйте сопоставить"bar" с остальной частью строки."сопоставьте один или несколько каталогов" семантика может быть легко достигнута с помощью "
foo/*/**/bar".и "
**/foo" спичка "foo" в дополнение к "x/foo","x/y/foo"..подписано-от: Нгуен Нгок Зуй страны
<pclouds@gmail.com>
Симон Бакан и прокомментировал:
текущие документы (
.gitignoreна странице) довольно ясно, что никакой подкаталог не требуется,x/**соответствует всем файлам под (возможно пустым)xв
.gitignoreстраница делает человек, говоря:трейлинг "
/**" соответствует всему внутри. Например, "abc/**"соответствует всем файлам внутри каталога"abc", относительно местоположения.gitignoreфайл, с бесконечной глубиной.косая черта, за которой следуют две последовательные звездочки, затем косая черта соответствует нулю или более каталогов. Например, "
a/**/b" совпадает с "a/b","a/x/b","a/x/y/b" и так далее.
когда * * не поддерживается, " / " по существу является завершающим символом для подстановочного знака, поэтому, когда у вас есть что-то вроде:
public/documents/**/*он по существу ищет два элемента подстановочных знаков между косыми чертами и не подбирает сами косые черты. Следовательно, это будет то же самое, что:
public/documents/*/*