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

Tiế*_*àng 5 git gitignore

foo//foo/in有什么不同吗.gitignore?我一直在阅读git-doc但我什么也没找到。这两个是一样的吗?

tor*_*rek 5

和之间有区别的。/foofoo

\n\n

要理解差异,请考虑目录(或文件夹,如果您喜欢这个词)以及它们可能包含嵌套子目录(子文件夹)的事实:

\n\n
foo/a/file1\nfoo/b/file2\nfoo/file3\nquux/foo/file4\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里,顶层目录foo包含两个子目录 ab一个文件,子目录各包含一个文件。顶层目录quux包含一个子目录foo,子目录包含一个文件。

\n\n

如果你的.gitignore清单foo

\n\n

如果您告诉 Git 忽略foo,Git 就不必在内部foo查找foo/afoo/bfoo/file3。由于没有查看内部foo,Git 不会查看内部foo/afoo/b,也不会找到foo/a/file1foo/b/file2

\n\n

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

\n\n

如果你的.gitignore清单/foo相反

\n\n

但是,如果您告诉 Git 忽略/foo而不是foo,那么当 Git 查找fooinside时quux,它​​将不会匹配,/foo因为/foo意味着仅在顶层忽略foo。所以 Git查看内部quux/foo并因此找到quux/foo/file4.

\n\n

后缀斜杠

\n\n

正如Void Raider 所回答的那样foo/在 a 中写入.gitignore告诉 Git 它应该匹配(因此不查看内部)目录 foo应该匹配(因此会抱怨 \xe2\x80\x94 见下文)一个名为foo. 在这里,前导斜杠仍然很重要:它告诉 Git 是将其应用于所有名为 的事物foo,还是仅应用于顶层的那些事物。

\n\n

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

\n\n

上述所有内容都描述了该操作,就好像您.gitignore在工作树的顶层仅存储了一个文件一样。但您可以为每个目录.gitignore存储一个文件。例如,如果您有目录,则可以创建。并且,在顶层,您可以列出一个名称,例如 ,或者您可以列出在 中。这些各有什么作用?quuxquux/.gitignore.gitignorequux/foofooquux/.gitignore

\n\n

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

\n\n
    \n
  • Unix 风格的路径名通常称为绝对路径(如果它们以 开头)/(例如/a/b/c)或相对路径(如果不以 )开头,例如a/b/c。绝对路径告诉操作系统从主机目录树的顶部启动,而相对路径告诉操作系统从当前目录启动。

  • \n
  • Unix 风格的 shell 支持路径名上的globbingglob操作。例如,这里*匹配任何字符的任何数字(包括零),因此像a*c匹配ac、 abc ,abbbc ,axyzc` 等名称。

  • \n
  • Git 支持(在多个地方,包括在.gitattributes命令行选项中和作为命令行选项)路径名模式,Git 称之为pathspecs。Git 中的不同功能支持不同类型的路径规范。忽略文件特别是实现 glob 模式。

  • \n
\n\n

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

\n\n

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

\n\n

放入foo(不带前导斜杠)quux/.gitignore意味着 Git 将忽略quux/sub/foo,而放入quux/foo顶级.gitignore意味着 Git 不会忽略quux/sub/foo因为将嵌入斜杠路径名视为绝对路径名的特殊性。

\n\n

一个重要的警告:要忽略的是,路径不得驻留在索引中

\n\n

如果路径名出现在存储库的索引中,则无论对文件进行多少修改都.gitignore不会使其被忽略。

\n\n

要查看索引中当前的所有内容git ls-files --stage,请使用. 请注意,这会在大型存储库中打印很多名称这就是为什么你通常不会直接查看索引:它太多了,就像试图看太阳一样。将索引中的内容与其他内容进行比较要好得多。这就是它的git status作用,这就是.gitignore文件真正发挥作用的地方。

\n\n

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

\n\n

第二比较将索引中的内容与工作树中的内容进行比较。无论这里有什么不同,git status都将其称为not staged for commit或 \xe2\x80\x94for some files\xe2\x80\x94 untracked。其中一些未跟踪的文件是您不想提交的文件您也不希望 Git 为这些文件打扰您。

\n\n

未跟踪的文件非常简单地定义为根本不在索引中的路径名。如果工作树中存在相同的路径名,则不会跟踪该文件。Git 会对此抱怨。在文件中列出该路径名将.gitignore告诉 Git:闭嘴这个文件,它应该未被跟踪。 但是如果它被跟踪\xe2\x80\x94 如果文件已经在索引\xe2\x80\x94 中,Git 将不会检查.gitignore其名称;它只是假设应该提交该文件。

\n