foo/
中的/foo/
和.gitignore
之间有什么区别吗?
我一直在读git-doc,但是什么也没找到。那两个都一样吗?
答案 0 :(得分:1)
/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在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/
也是相同的。