Git中的白名单和子目录

时间:2012-02-06 15:54:12

标签: git gitignore

我只为文本文件创建了一个白名单。

*
!*.txt

现在,我在子目录中有一个未跟踪的文本文件 - sub/dir/file.txt,并且未显示(忽略它)。但是,会显示根目录中的文本文件。

为什么会这样,我该如何解决?

3 个答案:

答案 0 :(得分:116)

如果以这种方式尝试,它将会失败,因为您最终会将结构中的目录列入黑名单。

要解决此问题,您希望将不是目录的所有内容列入黑名单,并且不是要提交的文件类型之一,而不是将目录列入黑名单

执行此操作的.gitignore文件:

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc

使用.txt在存在*.one*.two*.three文件的.gitignore个文件的三级结构白名单中对此进行了测试位于存储库的根目录中 - 适合我。您不必将.gitignore文件添加到结构中的所有目录。

我用来找出答案的信息来自this(stackoverflow.com)。

答案 1 :(得分:3)

更简单的方法是:

# Ignore all files...
*.*

# ...except the ones we want
!*.txt

这之所以有效,是因为gitignore将不以/开头的模式应用于.gitignore文件下面的每个级别:

如果在模式的开头或中间(或两者)都有分隔符,则该模式是相对于特定.gitignore文件本身的目录级别的。否则,模式也可能在.gitignore级别以下的任何级别匹配。

如果您要对目录中的文件执行此操作,事情将变得更加复杂:

# Ignore all files in all directories inside subdir...
/subdir/**/*.*

# ...except the ones we want
!/subdir/**/*.txt

之所以有效,是因为gitignore**有特殊的规则:

两个与完整路径名匹配的连续星号(“ **”)可能具有特殊含义:

  • 一个斜杠后跟两个连续的星号,然后一个斜杠匹配零个或多个目录。例如,“ a/**/b匹配“ a/b”,“ a/x/b”,“ a/x/y/b”等等。

关键是要确保您不要忽略目录,因为无论其他规则如何,该目录中的每个文件都会被忽略。

答案 2 :(得分:0)

我搜索了很长时间:

  1. 假设我有一个大型文件夹结构,其中递归嵌套了约100.000个目录。在这些文件夹中,大约有30.000个类型为.txt的文件(在我的情况下为:类型*.md)。可以说,在这些*.md文件的旁边,有500GB我不想跟踪的文件(超过一百万)。

  2. 我希望git只跟踪所有文件夹和子目录中的.txt(或*.md)个文件。

正确答案应该是:在Git中是不可能的。

我做了什么:

[edit:也不起作用- 我试图用符号链接(或硬链接)创建一个文件夹,并在其中使用git,但是git不遵循符号链接并覆盖硬链接。 h!]