Я не понимаю, как правильно игнорировать содержимое каталога в git.
Предположим, у меня есть следующая структура каталогов:
my_project
|--www
|--1.txt
|--2.txt
|--.gitignore
В чем разница между этим:
www
И это?
www/*
Причина, по которой я задаю этот вопрос: в git, если каталог пуст, git не будет включать такой пустой каталог в репозиторий. Итак, я пробовал решение, которое добавляет дополнительный файл .gitkeep в каталог, чтобы он не был пустым. Когда я пробовал это решение, если в файле .gitignore я писал, как показано ниже:
www
!*.gitkeep
Это не работает (я намерен игнорировать все содержимое в www, но сохранить каталог). Но если я попробую следующее:
www/*
!*.gitkeep
Тогда это работает! Так что я думаю, что между этими двумя подходами должны быть некоторые различия.
bin
иbin/
заключается в том, что первый игнорирует файлы или папки, а второй - только папки. Я не знаю разницу сbin/*
Ответы:
Есть различия между
www
,www/
иwww/*
.В основном из документации и моих собственных тестов
www
найти совпадение с файлом или каталогом, соответствуетwww/
только каталогу, аwww/*
соответствует каталогам и файлам внутриwww
.Я буду обсуждать только различия между
www/
иwww/*
здесь, поскольку различия междуwww
иwww/
очевидны.Ведь
www/
git игнорирует сам каталогwww
, а это значит, что git даже не заглянет внутрь. Но дляwww/*
git проверяет все файлы / папки внутриwww
и игнорирует их все с шаблоном*
. Похоже, это приводит к тем же результатам, поскольку git не будет отслеживать пустую папку,www
если все ее дочерние файлы / папки игнорируются. И действительно, результаты не будут различаться для случая OPwww/
илиwww/*
автономного. Но это имеет значение, если совмещать с другими правилами.Например, что, если мы хотим только включить,
www/1.txt
но игнорировать всех остальных внутриwww
?Следующее
.gitignore
не сработает.Хотя следующее
.gitignore
работает, почему?В первом случае git просто игнорирует каталог
www
и даже не заглядывает внутрь, чтобыwww/1.txt
снова включить его. Первое правило исключает родительский каталог,www
но не исключаетwww/1.txt
, и в результатеwww/1.txt
не может быть " включено снова ".Но для последнего git сначала игнорирует все файлы / файлы, находящиеся под ним
www
, а затем снова включает один из них, который естьwww/1.txt
.В этом примере могут помочь следующие строки в документации:
источник
www/1.txt
и тогдаwww/
будет делать то же самое, что второй подход ...Я просто разбираю документацию, и, насколько я могу судить, они отличаются только более продвинутыми шаблонами, например
Я сделал тест выше, и если заменить
!/foo
с!/foo/*
, вы действительно получите другой результат.Заметка
Исключит любой файл
foo
, ноисключит только каталоги с именем foo.
источник
Помимо совершенно хороших ответов, которые вы уже получили, вы должны отметить, что у вас может быть
.gitignore
любое место в вашем проекте, включая подпапки.Так что если вы хотите , чтобы игнорировать все файлы внутри
www
, но whantwww
папки для версируются, вместо того , чтобы использовать пустой.gitkeep
,.dummy
или любое имя вы выбрали, почему бы не использовать.gitignore
там, говоря , чтобы игнорировать все файлы?В корне
.gitignore
(а) вы ничего не говорите оwww
папке или ее содержимом.В
www/.gitignore
(б) вы указываете следующее:Таким образом, все выглядит более организованным (по крайней мере, для меня).
источник
Чтобы игнорировать все в каталоге, кроме файлов точек, вы можете использовать следующий шаблон глобуса в своем
.gitignore
:Так что не нужно ничего лишнего
.gitignore
, просто добавьте.keep
файл в свойwww
каталог.источник