.gitignore /foo 和 /foo/ 的区别
.gitignore The different between /foo and /foo/
在.gitignore
中foo/
和/foo/
有什么不同吗?
我一直在阅读 git-doc 但我什么也没找到。这两个是一样的吗?
基本上,/foo
找到与文件或目录的匹配,/foo/
只匹配目录,而/foo/*
匹配foo中的目录和文件。希望这对您有所帮助!
编辑:/foo
和 /foo/
也是一样的。
是 /foo
和 foo
的区别。
要了解差异,请考虑目录(或文件夹,如果您喜欢这个词)以及它们可能包含嵌套子目录(子文件夹)的事实:
foo/a/file1
foo/b/file2
foo/file3
quux/foo/file4
这里,顶层目录foo
包含两个子目录a
和b
加一个文件,子目录各包含一个文件。顶级目录quux
包含一个子目录foo
,其中包含一个文件
如果您的 .gitignore
列出 foo
如果您告诉 Git 忽略 foo
,Git 将不必查看 foo
内部来找到 foo/a
,foo/b
,以及 foo/file3
。没有查看 foo
,Git 也不会查看 foo/a
或 foo/b
,也不会找到 foo/a/file1
或 foo/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 支持所谓的 globbing 或 glob 对路径名的操作。例如,这里 *
匹配任何字符的任何数字(包括零),因此像 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
的名称;它只是假设文件应该被提交。
在.gitignore
中foo/
和/foo/
有什么不同吗?
我一直在阅读 git-doc 但我什么也没找到。这两个是一样的吗?
基本上,/foo
找到与文件或目录的匹配,/foo/
只匹配目录,而/foo/*
匹配foo中的目录和文件。希望这对您有所帮助!
编辑:/foo
和 /foo/
也是一样的。
是 /foo
和 foo
的区别。
要了解差异,请考虑目录(或文件夹,如果您喜欢这个词)以及它们可能包含嵌套子目录(子文件夹)的事实:
foo/a/file1
foo/b/file2
foo/file3
quux/foo/file4
这里,顶层目录foo
包含两个子目录a
和b
加一个文件,子目录各包含一个文件。顶级目录quux
包含一个子目录foo
,其中包含一个文件
如果您的 .gitignore
列出 foo
如果您告诉 Git 忽略 foo
,Git 将不必查看 foo
内部来找到 foo/a
,foo/b
,以及 foo/file3
。没有查看 foo
,Git 也不会查看 foo/a
或 foo/b
,也不会找到 foo/a/file1
或 foo/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 风格的路径名如果以
[=开始213=]/
开头,通常称为 absolute,例如/a/b/c
,或 relative如果不是,比如a/b/c
。绝对路径告诉操作系统从主机目录树的顶部开始,而相对路径告诉操作系统从当前目录.Unix 风格的 shell 支持所谓的 globbing 或 glob 对路径名的操作。例如,这里
*
匹配任何字符的任何数字(包括零),因此像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
的名称;它只是假设文件应该被提交。