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
.gitignore规则与尾随斜杠的区别,如/dir和/dir/_Git_Gitignore - Fatal编程技术网

.gitignore规则与尾随斜杠的区别,如/dir和/dir/

.gitignore规则与尾随斜杠的区别,如/dir和/dir/,git,gitignore,Git,Gitignore,Git存储库中.gitignore文件中的/dir和/dir/之间有区别吗 以下有什么不同 /dir /dir/ /dir/* 这些模式有不同的含义 根据的“图案格式”部分: 如果模式以斜杠结尾,则出于以下描述的目的将其删除,但它只会找到与目录匹配的内容。换句话说,foo/将匹配目录foo及其下的路径,但不会匹配常规文件或符号链接foo(这与pathspec在git中的一般工作方式一致) 如果模式不包含斜杠/,git将其视为shell glob模式,并检查与.gitignore文件位置相关的

Git存储库中.gitignore文件中的
/dir
/dir/
之间有区别吗

以下有什么不同

/dir
/dir/
/dir/*
这些模式有不同的含义 根据的“图案格式”部分:

  • 如果模式以斜杠结尾,则出于以下描述的目的将其删除,但它只会找到与目录匹配的内容。换句话说,foo/将匹配目录foo及其下的路径,但不会匹配常规文件或符号链接foo(这与pathspec在git中的一般工作方式一致)

  • 如果模式不包含斜杠/,git将其视为shell glob模式,并检查与.gitignore文件位置相关的路径名是否匹配(如果不是来自.gitignore文件,则与工作树的顶层相关)


这意味着“dir”可以是文件、目录或符号链接,但带有尾随斜杠的“dir/”只能与目录匹配。在大多数情况下,差异并不重要,但当它发生时,理解差异可以消除.gitignore文件中的歧义。

这是一个老问题,但在谷歌排名靠前,投票结果是错误的。下面是正确的答案

是的,这些规则是不同的

  • /dir
    将匹配名为
    dir
  • /dir/
    将只匹配名为
    dir
  • /dir/*
    将匹配所有文件、目录和其中的任何内容 名为
    dir
    (但不是
    dir
    目录本身)的目录
/dir
/dir/
/dir/*
不等效的。区别 在使用覆盖规则时非常清楚,如著名的
!。gitkeep
以绕过跟踪空目录的限制。假设 文件
dir/.gitkeep

  • 使用
    /dir
    /dir/
    ,Git甚至不会查看目录内部 因此,
    .gitkeep
    将不会被看到
  • 使用
    /dir/*
    ,Git和目录将检测文件 如果提交了此
    .gitcept
    ,则将保留,因为规则 不适用于目录本身,仅适用于其内容
观察:上述所有规则都锚定在当前目录中 (由于
/
前缀,
.gitignore
所在的位置)。 如果没有前缀,规则不仅适用于该特定目录,还适用于子目录或存储库中的任何位置, 如果
.gitignore
位于根级别。

git2.23(2019年第3季度)试图修改gitignore模式中有关斜杠的描述(用于指示“仅锚定到此级别”和“仅 匹配目录“)

现在包括:

  • 斜杠“
    /
    ”用作目录分隔符。
    分隔符可能出现在
    .gitignore
    搜索模式的开头、中间或结尾

  • 如果在模式的开头或中间(或两者)有分隔符,则模式与特定
    .gitignore
    文件本身的目录级别相关。
    否则,模式也可能在
    .gitignore
    级别以下的任何级别匹配

  • 如果模式末尾有分隔符,那么模式将只匹配目录,否则模式可以同时匹配文件和目录

  • 例如,模式
    doc/frotz/
    匹配
    doc/frotz
    目录,但不匹配
    a/doc/frotz
    目录
    但是
    frotz/
    匹配作为目录的
    frotz
    a/frotz
    (所有路径都与
    .gitignore
    文件相对)

  • 星号“
    *
    ”与除斜杠以外的任何东西都匹配。
    字符“
    ”与除“
    /
    ”以外的任何一个字符匹配
    范围符号,例如
    [a-zA-Z]
    ,可用于匹配范围中的一个字符。
    有关更详细的说明,请参见fnmatch(3)和
    FNM\u路径名
    标志


“OBS”应该是什么意思?@xehpuk For observe/observation
dir/
是否将符号链接与名为
dir
的目录匹配?如果是这样的话,这种行为在Git版本中有没有改变?对于我的团队中的每个人来说,它似乎都很匹配,除了一个同事。@0xbe5077ed,理论上符号链接只是一个文件,因此
dir/
不应该匹配它。我只是在本地测试它,事实上,它不符合预期。我使用的是Git v2.10.0。它写在那里@LukAron,“…”没有前缀,规则不仅适用于特定目录,也适用于子目录。如果您的
.gitignore
中有
dir
,它将匹配名为
dir
的文件、目录和符号链接,这些文件、目录和符号链接位于
.gitignore
所在的任何嵌套目录中。下面接受的答案错误地指出/dir/和/dir/*是等效的。请看维克多的回答: