.git忽略/foo和/foo之间的差异/
.git忽略/foo和/foo之间的差异/,git,gitignore,Git,Gitignore,.gitignore中的foo/和/foo/之间有什么不同吗? 我一直在看书,但什么也没找到。这两者是否相同?基本上,/foo查找与文件或目录的匹配,/foo/仅匹配目录,而/foo/*匹配foo中的目录和文件。希望这有帮助 编辑:同样/foo和/foo/是相同的。在/foo和foo之间有区别 要理解其中的区别,请考虑目录(或文件夹,如果您喜欢该词)以及它们可能包含嵌套子目录(子文件夹)的事实: 这里,顶级目录foo包含两个子目录a和b加上一个文件,子目录各包含一个文件。顶级目录qux包含一个子
.gitignore
中的foo/
和/foo/
之间有什么不同吗?
我一直在看书,但什么也没找到。这两者是否相同?基本上,
/foo
查找与文件或目录的匹配,/foo/
仅匹配目录,而/foo/*
匹配foo中的目录和文件。希望这有帮助
编辑:同样
/foo
和/foo/
是相同的。在/foo
和foo
之间有区别
要理解其中的区别,请考虑目录(或文件夹,如果您喜欢该词)以及它们可能包含嵌套子目录(子文件夹)的事实:
这里,顶级目录foo
包含两个子目录a
和b
加上一个文件,子目录各包含一个文件。顶级目录qux
包含一个子目录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跳过qux
,因此Git将查看qux
内部并找到foo
。如果您告诉Git忽略foo
,Git就不必查看qux/foo
,因此它不会找到qux/foo/file4
如果您的.gitignore
列出了/foo
但是,如果您告诉Git忽略/foo
而不是foo
,当Git在quux
中找到foo
时,它将与/foo
不匹配,因为/foo
意味着只在顶层忽略foo
。因此Git将在qux/foo
中查找,从而找到qux/foo/file4
后缀斜杠
同样,在.gitignore
中写入foo/
告诉Git它应该匹配目录foo
,但不应该匹配名为foo
的普通文件(因此会抱怨如下)。在这里,前导斜杠也很重要:它告诉Git是将其应用于所有名为foo
的事物,还是仅应用于顶级的事物
更多细节,因为细节很重要
以上所有内容都描述了该操作,就好像在工作树的顶层只存储了一个.gitignore
文件一样。但是您可以在每个目录中存储一个.gitignore
文件。例如,如果您有一个qux
目录,您可以创建qux/.gitignore
。并且,在顶级.gitignore
中,您可以列出类似qux/foo
的名称,也可以在qux/.gitignore
中列出foo
。每一个都有什么作用
首先,让我们定义一些术语:
- Unix样式的路径名通常称为绝对路径名(如果它们以
开头,例如/
),或者称为相对路径名(如果它们不以/a/b/c
开头,例如
)。绝对路径告诉操作系统从主机目录树的顶部开始,而相对路径告诉操作系统从当前目录开始a/b/c
- Unix样式的shell支持对路径名执行所谓的globbing或glob操作。这里,例如,
匹配任何字符的任何数字(包括零),因此像*
这样的名称匹配a*c
、abcac
abbbc、
axyzc`等、
- Git支持(在多个位置,包括在
中以及作为命令行选项)路径名模式,Git称之为PathSpec。Git中的不同功能支持不同类型的路径规范。忽略文件,尤其是实现全局模式的文件.gittributes
.gitignore
文件中,任何绝对路径始终指向当前目录。因此,如果存在qux/.gitignore
,并且包含/foo
,则与名为qux/foo
的文件或目录匹配。您可以将其作为/qux/foo
放入顶级.gitignore
文件中
在任何.gitignore
文件中,包含嵌入/
(不在模式末尾)的任何路径名也被视为绝对路径!这意味着将qux/foo
放入顶层.gitignore
与将/qux/foo
放入顶层.gitignore
相同
将foo
(无前导斜杠)放入qux/.gitignore
意味着Git将忽略qux/sub/foo
,而将qux/foo
放入顶级。gitignore
意味着Git不会忽略qux/sub/foo
,由于这种特殊性,将嵌入的斜杠路径名视为绝对路径名
一个重要的警告:要忽略,路径不能驻留在索引中
如果路径名出现在存储库的索引中,则无论对.gitignore
文件做多少修改都不会使其被忽略
要查看当前索引中的所有内容,请使用gitls文件--stage
。请注意,这会在大型存储库中打印大量名称!这就是为什么你通常不直接看指数的原因:它太多了,就像试着看太阳一样。将索引中的内容与其他内容进行比较要好得多。这就是git status
所做的,这就是.gitignore
文件真正进入画面的地方
当运行git status
时,git运行两个比较。第一个比较当前或HEAD
,co
foo/a/file1
foo/b/file2
foo/file3
quux/foo/file4