Git忽略目录和directory / *有什么区别?


108

我对忽略git中目录内容的正确方法感到困惑。

假设我具有以下目录结构:

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

放这之间有什么区别:

www

还有这个?

www/*

我问这个问题的原因是:在git中,如果目录为空,则git不会在存储库中包含此类空目录。所以我正在尝试的解决方案是在目录下添加一个额外的.gitkeep文件,这样它就不会为空。当我尝试该解决方案时,如果在.gitignore文件中,则编写如下:

www
!*.gitkeep

它不起作用(我的意图是忽略www下的所有内容,但保留目录)。但是,如果我尝试以下操作:

www/* 
!*.gitkeep

然后就可以了!因此,我认为这两种方法之间必须有所区别。


bin和之间的简单区别bin/是,前者将忽略文件或文件夹,后者仅忽略文件夹。我不知道与bin/*
上校恐慌

Answers:


203

有是之间的差异wwwwww/以及www/*

基本上从文档和我自己的测试中,www找到与文件或目录的www/匹配项,仅与目录www/*匹配,而与内部的目录和文件匹配www

我只是会在之间的差异讨论www/,并www/*在这里,因为之间的差异wwwwww/显着。

对于www/,git会忽略目录www本身,这意味着git甚至不会查看内部。但为此www/*,git检查其中的所有文件/文件夹www,并使用pattern忽略所有文件/文件夹*。这似乎导致了相同的结果,因为如果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

对于此示例,文档中的以下几行可能会有所帮助:

可选前缀“!” 否定了模式;先前模式排除的所有匹配文件将再次包含在内。如果排除了该文件的父目录,则无法重新包含该文件。


您不认为那会www/1.txtwww/第二种方法一样吗?
Naveed Butt 2014年

8

我只是在解释文档,据我所知,它们仅在更高级的模式中有所不同,例如

$ cat .gitignore
    # exclude everything except directory foo/bar
    /*
    !/foo
    /foo/*
    !/foo/bar

确实测试了上述内容,如果将替换!/foo!/foo/*,则确实会得到不同的结果。

注意

foo

将排除任何文件foo,但

foo/

仅排除名为foo的目录。


3

除了已经获得的完美答案之外,您还应该注意,.gitignore项目中可以包含任何位置,包括子文件夹。

所以,如果你想忽略里面所有文件www,但whant的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

这样,一切看起来都更有条理(至少对我而言)。


1

要忽略目录中除点文件之外的所有内容,可以在您的中使用以下glob-pattern .gitignore

www/[^.]*

因此,无需额外的操作.gitignore,只需将.keep文件添加到www目录中即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.