我已经为文本文件创建了白名单。
*
!*.txt
现在,我在子目录-中有一个未跟踪的文本文件sub/dir/file.txt
,并且未显示(被忽略)。但是,显示了根目录中的文本文件。
为什么会这样,我该如何解决?
我已经为文本文件创建了白名单。
*
!*.txt
现在,我在子目录-中有一个未跟踪的文本文件sub/dir/file.txt
,并且未显示(被忽略)。但是,显示了根目录中的文本文件。
为什么会这样,我该如何解决?
.gitignore
。
Answers:
如果以这种方式尝试,它将失败,因为您最终会将结构中的目录列入黑名单。
为了解决此问题,您想将所有不是目录的内容,也不是要提交的文件类型之一,都列入黑名单,而不要将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)。
!.gitignore
,使用时*
,不是吗?
/*
仅将顶级文件夹列入黑名单,而不是对所有文件夹进行递归,这可能会更有用,这实际上意味着.gitignore
不应查看列入白名单的文件夹的子文件夹。
实现此目的的一种更简单的方法是:
# 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
”等。
关键是要确保您不要忽略目录,因为无论其他规则如何,该目录中的每个文件都会被忽略。