Git中的白名单和子目录


91

我已经为文本文件创建了白名单。

*
!*.txt

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

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



您要包含在子目录中的文件吗?如果是这样,您的中的第一个星号可能已经忽略了此子目录.gitignore
fajran 2012年

是。在我的示例中,这些文件的目录结构将与11.1.102.55文件夹一样低。文件夹/产品之间的嵌套并不总是相同的。
Nate 2012年

1
我知道这个功能。我们有数百个目录。只显式地忽略我们不想要的文件类型比对每个目录制作一个gitignore更快。我确实在寻找一种从.gitignore文件中获取白名单功能的方法。
Nate 2012年

1
我看不到这是怎么重复的。另一个问题询问如何将某些文件列入白名单,而这个问题询问如何将某些文件类型(包括子文件夹)列入白名单。实际上,它更像是stackoverflow.com/questions/8024924/…的副本。
Big McLargeHuge 2013年

Answers:


146

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

为了解决此问题,您想将所有不是目录的内容,也不是要提交的文件类型之一,都列入黑名单而不要将directorys列入黑名单

.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文件添加到结构中的所有目录中。

我用来弄清楚答案的信息尤其来自(stackoverflow.com)。


18
您还需要输入!.gitignore,使用时*,不是吗?
sjas 2013年

2
请在此处查看我的答案:stackoverflow.com/questions/987142/…使用/*仅将顶级文件夹列入黑名单,而不是对所有文件夹进行递归,这可能会更有用,这实际上意味着.gitignore不应查看列入白名单的文件夹的子文件夹。
瑞安·泰勒

1

实现此目的的一种更简单的方法是:

# Blacklist all files...
*.*

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

之所以起作用,是因为gitignore将并非/.gitignore文件开头的模式应用于文件以下的每个级别:

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

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

# Blacklist 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”等。

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


0

我搜索了很长时间:

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

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

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

相反,我做了什么:

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

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.