Git中的白名单和子目录

nzkunb0c  于 2023-03-11  发布在  Git
关注(0)|答案(4)|浏览(544)

我已经创建了一个仅用于文本文件的白名单。

*
!*.txt

现在,我在子目录-sub/dir/file.txt中有一个未跟踪的文本文件,它没有显示(被忽略),但是显示了根目录中的文本文件。
为什么会这样?我该怎么解决?

jfgube3f

jfgube3f1#

如果您尝试这样做,它会失败,因为您最终会将结构中的目录列入黑名单。
要解决这个问题,您需要将所有不是目录且不是您要提交的文件类型之一的内容列入黑名单,同时不将目录列入黑名单
.gitignore文件将执行以下操作:

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

*.one*.two*.three文件存在的情况下,使用位于存储库根目录的.gitignore.txt文件的三级结构白名单中测试了这一点-对我很有效。您不必将.gitignore文件添加到结构中的所有目录。
我用来找出答案的信息来自this(stackoverflow.com)。

yebdmbv4

yebdmbv42#

实现这一点的更简单方法是:

# Ignore all files...
*.*

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

这是因为gitignore将不以/开头的模式应用到.gitignore文件以下的每个级别:
如果模式的开头或中间(或两者)有分隔符,则该模式相对于特定.gitignore文件本身的目录级别。否则,该模式还可能在.gitignore级别以下的任何级别匹配。
如果您想对 directory 中的文件执行此操作,事情会变得更加复杂:

# 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“等。

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

bvuwiixz

bvuwiixz3#

我找了很久:
1.假设我有一个很大的文件夹结构,其中递归嵌套了大约100.000个目录,在这些文件夹中,大约有30.000个.txt类型的文件(在我的例子中:在这些*.md文件旁边,有,比方说,500 GB的(一百万+)文件,我不想跟踪。
1.我希望git只跟踪所有文件夹和子目录中的.txt(或*.md)文件。
正确答案应为:这在Git中不可能。
我做的是:
[edit:也不起作用--我试着创建一个带有符号链接(或硬链接)的文件夹,然后在那里使用git,但是git没有遵循符号链接,而是覆盖了硬链接。

du7egjpx

du7egjpx4#

如果您想忽略存储库中除.txt文件之外的所有内容,.gitignore应该如下所示:

# Ignore everything
*
# Whitelist every directories, so we can recurse into them
!*/
# Whitelist .gitignore and .txt
!.gitignore
!*.txt

但是,如果您想忽略存储库中的一个文件夹,并将任何目录或子目录中的.txt文件列入白名单:

# Recursively ignore every files in my_folder
/my_folder/**
# Recursively whitelist every directories in my_folder
!/my_folder/**/
# Whitelist .txt
!*.txt

相关问题