.gitignore /foo 和 /foo/ 的区别

.gitignore The different between /foo and /foo/

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

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

编辑:/foo/foo/ 也是一样的。

/foofoo 的区别。

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

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

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

如果您的 .gitignore 列出 foo

如果您告诉 Git 忽略 foo,Git 将不必查看 foo 内部来找到 foo/afoo/b,以及 foo/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 在 quux 中找到 foo 时,它 不会 匹配 /foo 因为 /foo 意味着 仅在顶层忽略 foo 。所以 Git 往里面看 quux/foo 因此 找到 quux/foo/file4.

后缀斜杠

,在 .gitignore 中写入 foo/ 告诉 Git 它应该匹配(因此不向内查找) 目录 foo,但应该 匹配(因此会抱怨——见下文)一个普通的 file 命名为 foo。在这里,前导斜杠仍然很重要:它告诉 Git 是将其应用于 所有 名为 foo 的事物,还是仅应用于顶层的那些事物。

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

以上所有描述的操作就好像您只有一个 .gitignore 文件存储在工作树的顶层。但是您可以在每个目录 中存储一个.gitignore 文件。例如,如果您有一个 quux 目录,您可以创建 quux/.gitignore。并且,在顶级 .gitignore 中,您可以列出 quux/foo 之类的名称,或者您可以在 quux/.gitignore 中列出 foo。这些都有什么作用?

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

  • Unix 风格的路径名如果以 / 开头,通常称为 absolute,例如 /a/b/c,或 relative如果不是,比如a/b/c。绝对路径告诉操作系统从主机目录树的顶部开始,而相对路径告诉操作系统从当前目录.

    [=开始213=]
  • Unix 风格的 shell 支持所谓的 globbingglob 对路径名的操作。例如,这里 * 匹配任何字符的任何数字(包括零),因此像 a*c 这样的名称匹配 ac, abc,abbbc, axyzc` 等等。

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

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

放入顶级 .gitignore 文件中

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

foo(没有前导斜杠)放入quux/.gitignore意味着Git将忽略quux/sub/foo,而将quux/foo放入顶层.gitignore 意味着 Git 将 而不是 忽略 quux/sub/foo,因为这种将嵌入的斜杠路径名视为绝对路径名的特性。

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

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

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

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

second 比较将索引中的内容与工作树中的内容进行比较。无论这里有什么不同,git status 称其为 not staged for commit 或者——对于某些文件——untracked。其中一些未跟踪的文件将是您不想提交的文件,并且您不希望Git为它们打扰您.

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