В чем разница между git игнорируя каталог и каталог/*?



Я смущен тем, что это правильный способ игнорировать содержимое каталога в git.



предположим, что у меня есть следующая структура каталогов:



my_project  
|--www
|--1.txt
|--2.txt
|--.gitignore


в чем разница между помещением этого:



www


и этого?



www/*


причина, по которой я задаю этот вопрос: в git, если каталог пуст, git не будет включать такой пустой каталог в репозиторий. Поэтому я пробовал решение, которое добавляет дополнительный .gitkeep файл под каталог, чтобы он не был пустым. Когда я пробовал это решение, если в .gitignore файл, я пишу, как показано ниже:



www
!*.gitkeep


Это не работает(мое намерение состоит в том, чтобы игнорировать все содержимое под www, но сохранить каталог). Но если я попробую следующее:



www/* 
!*.gitkeep


тогда это работает! Поэтому я думаю, что это должно иметь некоторые различия между двумя подходами.

656   4  

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 the www папка должна быть версионной, а не использовать пустой .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

    Ничего не найдено.