В чем разница между git игнорируя каталог и каталог/*?
Я смущен тем, что это правильный способ игнорировать содержимое каталога в git.
предположим, что у меня есть следующая структура каталогов:
my_project
|--www
|--1.txt
|--2.txt
|--.gitignore
в чем разница между помещением этого:
www
и этого?
www/*
причина, по которой я задаю этот вопрос: в git, если каталог пуст, git не будет включать такой пустой каталог в репозиторий. Поэтому я пробовал решение, которое добавляет дополнительный .gitkeep файл под каталог, чтобы он не был пустым. Когда я пробовал это решение, если в .gitignore файл, я пишу, как показано ниже:
www
!*.gitkeep
Это не работает(мое намерение состоит в том, чтобы игнорировать все содержимое под www, но сохранить каталог). Но если я попробую следующее:
www/*
!*.gitkeep
тогда это работает! Поэтому я думаю, что это должно иметь некоторые различия между двумя подходами.
4 ответов:
есть различия между
www,www/иwww/*.в принципе от документация и мои собственные тесты,
wwwнайти совпадение с файлом или каталогом,www/только соответствует каталогу, в то время какwww/*соответствует каталогам и файлам внутриwww.я буду обсуждать только различия между
www/иwww/*здесь, так как различия междуwwwиwww/несколько очевидный.на
www/, git игнорирует каталогwwwсам, что означает, что git даже не будет смотреть внутрь. Но дляwww/*, git проверяет все файлы/папки внутриwww, и игнорирует все из них с шаблоном*. Это, кажется, приводит к тем же результатам, так как git не будет отслеживать пустую папкуwwwесли все его дочерние файлы/папки игнорируются. И действительно, результаты не будут иметь никакого значения для случая OP сwww/илиwww/*автономное. Но это имеет значение, если это сочетается с другими правилами.например, что делать, если мы хотим включить только
www/1.txtно игнорировать все остальные внутриwww?следующее
.gitignoreне работает.www/ !www/1.txt, а после
.gitignoreработает, почему?www/* !www/1.txtдля первого, git просто игнорирует каталог
www, и даже не будет смотреть внутрь, чтобы включитьwww/1.txtснова. Первое правило исключает родительский каталогwwwа неwww/1.txt, а как результатwww/1.txtне может быть "включить снова".но для последнего git сначала игнорирует все файлы / папки под
www, а затем включает в себя один из них снова, который являетсяwww/1.txt.в этом примере могут помочь следующие строки в документации:
необязательный префикс "!"что отрицает шаблон; любой соответствующий файл исключенный предыдущим шаблоном будет включен снова. Это не возможно повторное включение файла если родительский каталог файл исключенный.
Я просто разбираю документацию, и насколько я могу судить, они отличаются только более продвинутыми шаблонами, например
$ cat .gitignore # exclude everything except directory foo/bar /* !/foo /foo/* !/foo/barЯ сделал проверьте выше, и если вы замените
!/fooС!/foo/*, вы действительно получаете другой результат.Примечание
fooне исключает какой-либо файл
foo, аfoo/будут исключены только каталоги с именем foo.
помимо совершенно хороших ответов, которые вы уже получили, вы должны отметить, что вы можете иметь
.gitignoreв любом месте вашего проекта, включая подпапки.так что если вы хотите, чтобы игнорировать все файлы внутри
www, но whant thewwwпапка должна быть версионной, а не использовать пустой.gitkeep,.dummyили какое бы имя вы ни выбрали, почему бы не использовать.gitignoreтам, говоря игнорировать все файлы?/ |- .gitignore (a) \- www |- .gitignore (b) |- 1.jpg \- 2.jpgв корень
.gitignore(a), вы ничего не говорите насчетwwwпапка или ее содержимое.на
www/.gitignore(b) вы ставите следующее:# ignore all files in this folder except this .gitignore * !.gitignoreтаким образом все выглядит более организовано (для меня по крайней мере).
чтобы игнорировать все в каталоге, кроме dotfiles, вы можете использовать следующий шаблон glob в своем
.gitignore:www/[^.]*так что нет необходимости в дополнительном
.gitignore, просто добавьте на
Comments