108

I'm confused about what's the correct way to ignore the contents of a directory in git.

Assume I have the following directory structure:

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

What's the difference between putting this:

www

And this?

www/*

The reason I'm asking this question is: In git, if a directory is empty, git won't include such empty directory in repository. So I was trying the solution that is add an extra .gitkeep file under the directory so that it won't be empty. When I was trying that solution, if in the .gitignore file, I write like below:

www
!*.gitkeep

It doesn't work(My intention is to ignore all contents under www but keep the directory). But if I try the following:

www/* 
!*.gitkeep

Then it works! So I think it must has some differences between the two approaches.

4

4 回答 4

203

www之间存在差异。www/www/*

基本上从文档和我自己的测试中,www找到与文件或目录匹配的,www/只匹配一个目录,而www/*匹配目录和文件里面www的 .

我将在这里只讨论www/和之间www/*的差异,因为和之间的差异wwwwww/显而易见的。

对于www/,git 会忽略目录www本身,这意味着 git 甚至不会查看内部。但是对于www/*, git 检查里面的所有文件/文件夹www,并忽略所有带有模式的文件/文件夹*www这似乎会导致相同的结果,因为如果忽略其所有子文件/文件夹,git 将不会跟踪空文件夹。事实上,对于 OP 的情况,无论是独立www/还是www/*独立,结果都没有区别。但是,如果它与其他规则结合使用,它确实会产生差异。

例如,如果我们只想包含www/1.txt但忽略里面的所有其他人www怎么办?

以下.gitignore将不起作用。

www/
!www/1.txt

虽然以下.gitignore有效,但为什么?

www/*
!www/1.txt

对于前者,git 只是忽略了 directory www,甚至不会www/1.txt再往里面包含。第一条规则排除了父目录www但不排除www/1.txt,因此www/1.txt不能“再次包含”。

但是对于后者,git首先忽略 . 下的所有文件/文件夹www,然后再次包含其中一个,即www/1.txt.

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

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

于 2014-09-08T02:45:26.453 回答
8

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

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

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

笔记

foo

将排除任何文件foo,但

foo/

只会排除名为 foo 的目录。

于 2014-09-08T01:08:22.400 回答
3

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

因此,如果您想忽略其中的所有文件www,但希望对文件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

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

于 2014-09-09T09:08:48.063 回答
1

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

www/[^.]*

所以不需要额外的.gitignore,只需将.keep文件添加到您的www目录即可。

于 2014-09-09T22:25:44.627 回答