Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.git忽略/foo和/foo之间的差异/_Git_Gitignore - Fatal编程技术网

.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
    这样的名称匹配
    ac
    、abc
    abbbc
    axyzc`等

  • Git支持(在多个位置,包括在
    .gittributes
    中以及作为命令行选项)路径名模式,Git称之为PathSpec。Git中的不同功能支持不同类型的路径规范。忽略文件,尤其是实现全局模式的文件

.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