我只为文本文件创建了一个白名单。
*
!*.txt
现在,我在子目录中有一个未跟踪的文本文件 - sub/dir/file.txt
,并且未显示(忽略它)。但是,会显示根目录中的文本文件。
为什么会这样,我该如何解决?
答案 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)
我搜索了很长时间:
假设我有一个大型文件夹结构,其中递归嵌套了约100.000个目录。在这些文件夹中,大约有30.000个类型为.txt
的文件(在我的情况下为:类型*.md
)。可以说,在这些*.md
文件的旁边,有500GB我不想跟踪的文件(超过一百万)。
我希望git只跟踪所有文件夹和子目录中的.txt
(或*.md
)个文件。
正确答案应该是:在Git中是不可能的。
我做了什么:
[edit:也不起作用- 我试图用符号链接(或硬链接)创建一个文件夹,并在其中使用git,但是git不遵循符号链接并覆盖硬链接。 h!]