.gitignore / foo和/ foo /之间的区别

时间:2018-08-03 01:18:36

标签: git gitignore

foo/中的/foo/.gitignore之间有什么区别吗? 我一直在读git-doc,但是什么也没找到。那两个都一样吗?

2 个答案:

答案 0 :(得分:1)

/foofoo之间是

要了解它们之间的区别,请考虑目录(或文件夹,如果您更喜欢该词)以及它们可能包含嵌套的子目录(子文件夹)的事实:

foo/a/file1
foo/b/file2
foo/file3
quux/foo/file4

此处,顶级目录foo包含两个子目录 ab以及一个文件,子目录每个包含一个文件。顶级目录quux包含一个子目录foo,该子目录包含一个文件。

如果您的.gitignore列出了foo

如果您告诉Git忽略foo,则Git无需查看foo即可找到foo/afoo/bfoo/file3。没有看过foo的内部,Git也不会看过foo/afoo/b的内部,也找不到foo/a/file1foo/b/file2的任何一个。

同时,没有任何内容告诉Git跳过quux,因此Git会查看quux的内部并找到foo。如果您告诉Git忽略foo,则Git不必查看quux/foo的内部,因此它不会找到quux/foo/file4

如果您的.gitignore列出了/foo

但是,如果您告诉Git忽略/foo而不是foo,则当Git在foo内发现quux时,它不会匹配/foo,因为/foo表示仅在顶层忽略foo 。因此,Git 查看到quux/foo内部,因此 将找到quux/foo/file4

后缀斜杠

Void Raider answered一样,在foo/中写入.gitignore告诉Git它应该与目录 foo相匹配(因此不要在内部查找) ,但应该匹配(因此会困扰-见下文)一个名为foo的普通文件。同样,这里的前导斜线仍然很重要:它告诉Git是将其应用于所有名为foo的事物,还是仅应用于顶层的事物。

更多细节,因为细节很重要

以上所有内容都描述了该操作,就好像在工作树的顶层仅存储了一个.gitignore文件一样。但是您可以每个目录存储一个.gitignore文件 。例如,如果您有quux目录,则可以创建quux/.gitignore。并且,在顶级.gitignore中,您可以列出类似quux/foo的名称,也可以在foo中列出quux/.gitignore。这些都做什么?

首先,让我们定义一些术语:

    如果
  • Unix样式的路径名以/(例如/a/b/c relative )开头,通常称为 absolute 。如果没有,例如a/b/c。绝对路径告诉操作系统从主机目录树的顶部开始,而相对路径告诉操作系统从当前目录开始。

  • Unix风格的shell支持对路径名的 globbing glob 操作。例如,这里*匹配任何字符的任何数字(包括零),因此a*c之类的名称匹配ac,abc , abbbc , axyzc`,依此类推。

  • Git支持(在多个地方,包括.gitattributes和作为命令行选项)路径名 patterns ,Git称为 pathspecs 。 Git中的不同功能支持不同的路径规格。尤其是忽略文件来实现全局模式。

.gitignore文件中,任何绝对路径始终引用当前目录。因此,如果quux/.gitignore存在并包含/foo,则该文件与名为quux/foo的文件或目录匹配。您可以将其作为.gitignore放入顶级/quux/foo文件中。

在任何.gitignore文件中,任何包含嵌入式/(不在模式末尾)的路径名也将被 视为绝对!这意味着将quux/foo放入顶层.gitignore与将/quux/foo放入顶层.gitignore 是一样的!

foo(不带斜杠)放入quux/.gitignore意味着Git会忽略quux/sub/foo,而将quux/foo放入顶层.gitignore则意味着Git会不会忽略quux/sub/foo,因为将嵌入式斜线路径名视为绝对路径是一种特殊性。

一个重要的警告:被忽略的路径不能位于索引中

如果路径名出现在存储库的 index 中,则对.gitignore文件的摆弄不会使它被忽略。

要查看索引中当前的所有,请使用git ls-files --stage。请注意,这会在大型存储库中打印名称的 lot !这就是为什么您通常从不直接查看索引的原因:它太多了,就像试图查看太阳一样。最好比较索引中的内容与其他内容。这就是git status的工作,也是.gitignore文件真正输入图片的地方。

当您运行git status时,Git会运行两个比较。第一个将当前提交(即HEAD)与索引进行比较。无论这里有什么不同,git status都将其称为为提交准备的 。这是因为git commit将立即使用索引中的任何内容来制作新快照。我们通常不关心快照中的每个文件,而是关心与当前快照相比,新快照中的不同文件。 。这就是git status向我们展示的:不同的文件,或者准备提交的文件

第二比较将索引中的内容与工作树中的内容进行比较。不管这里有什么不同,git status都将其称为未上演提交的或(对于某些文件而言)是未跟踪的。这些未跟踪的文件中的某些文件将是您不想提交的文件,并且您不希望Git困扰您。

未跟踪的文件非常简单地定义为根本不在索引中的路径名。如果工作树中存在相同的路径名,那么将取消跟踪该文件。 Git会为此抱怨。在.gitignore文件中列出该路径名将告诉Git:对此文件闭嘴,应该被取消跟踪。但是,如果被跟踪< / em>-如果文件已经在索引中-Git不会检查.gitignore的名称;它只是假设文件应该已提交。

答案 1 :(得分:0)

基本上,/foo找到与文件或目录的匹配项,/foo/仅匹配目录,而/foo/*匹配foo中的目录和文件。希望这会有所帮助!

编辑:/foo/foo/也是相同的。