如何指定忽略.gitignore中的目录?

时间:2017-05-26 16:49:53

标签: git

在git存储库中,如果我想通过将其添加到.gitignore来忽略子目录(以及它下面的所有内容),那么

是否有任何区别
  • mysubdir
  • mysubdir/
  • mysubdir/*

?他们似乎和我一样。感谢。

2 个答案:

答案 0 :(得分:1)

“最正确的”是:

mysubdir/

列表中的第一个(mysubdir)将忽略该名称下的目录和文件;可能不是问题,但可能。最后一个只忽略目录下的文件,它具有相同的最终结果,因为默认情况下在Git中忽略空目录。

如果查看gitignore files provided by GitHub,您会看到他们总是按directory/语法忽略目录。

答案 1 :(得分:1)

存在一些差异,但它们很微妙。

没有尾部斜杠

使用:

mysubdir

忽略名为mysubdir的任何文件或目录。例如,如果它位于顶级.gitignore,并且您将目录A和B布局为:

A/
    file
    mysubdir         <-- a file, not a directory!
B/
    file
    mysubdir/        <-- an actual directory
        file

然后此.gitignore将忽略A/mysubdir(文件)和B/mysubdir(目录)。通过忽略第二个,它也会切断 B/mysubdir/中的所有文件

使用尾部斜杠

使用:

mysubdir/

仅忽略名为mysubdir目录。在这种情况下,A/mysubdir 被忽略,因为它是文件。但B/mysubdir是一个目录,因此会被忽略。

使用尾部斜杠和星号

使用:

mysubdir/*

告诉Git它应该忽略mysubdir中的所有文件和目录。为此,mysubdir必须 一个目录(如果不是,它不能包含文件和更多目录)。乍一看,这似乎与mysubdir/相同。但事实并非如此!

使用mysubdir/*时,强制Git 读取目录本身,列出其中的所有文件。然后,它会根据.gitignore文件中的模式检查每个文件。这意味着您可以向.gitignore文件添加覆盖:

!mysubdir/precious

由于前导!字符,此文件或目录未被忽略。但是对于Git来找到文件,Git必须首先读取目录。如果你列出mysubdir/而不是mysubdir/*,Git会让无法阅读目录,也不会发现mysubdir/precious的存在。

当然,强制Git读取目录有一个(轻微的)惩罚:Git必须花费任何时间来读取该目录。只有当惩罚给你带来某些东西时才应该这样做,例如忽略目录中的某个文件或子目录。