“git add -A :/”是什么意思?

8
我见过同事在仓库中使用git add -A :/来暂存文件,但我无法在文档中找到它的作用。我错过了什么吗?
注意:我理解标志-A的作用(该问题已在SO 之前得到回答)。我的问题特别关注:/git add中所起的作用。

"git add -A" 相当于 "git add .; git add -u"。"git add -A" 只是同时执行这两个命令的快捷方式。 - Moonhead
1
我认为 : 它指的是存储库的根目录,但我在文档中没有找到相关内容。 - Keith Thompson
1
我从未见过这种语法,但它看起来类似于参考规范 - Ryne Everett
1
@KeithThompson 请查看 https://www.kernel.org/pub/software/scm/git/docs/gitglossary.html 中路径规范的定义。 - lrineau
2个回答

8
正如您已经知道的那样,让我们仅谈论git add :/选项。根据git-add文档,最后一个参数是pathspec。它的定义在gitglossary文档中。让我引用相关部分(我将重要的句子放在了粗体中):

以冒号:开头的路径规范具有特殊含义。在短格式中,前导冒号:后跟零个或多个“魔法签名”字母(可选择由另一个冒号:结束),其余部分是与路径匹配的模式。如果模式以不能成为“魔术签名”的字符并且不是冒号的字符开头,则可以省略终止“魔术签名”的可选冒号。

在长格式中,前导冒号:后跟开括号(、逗号分隔的零个或多个“魔法词”和闭括号),其余部分是要与路径匹配的模式。

“魔法签名”由一个非字母数字的ASCII符号组成。

顶层 /

魔法词top(记忆:/)使模式从工作树的根匹配,即使您是在子目录中运行该命令也是如此。

当前只有斜杠/被认为是“魔法签名”,但预计我们将在后续版本的git中支持更多类型的魔法。

您可以看到,如果pathspec:/:(top)开头,则该部分定义为工作树的根。

git add :/会将工作树中的所有文件都添加到stage中。


git-add 的文档(至少你提供的那个)似乎没有在任何地方提到 pathspec。我已经为您修复了它。 - Amelio Vazquez-Reina
@user815423426 我不明白。git-add(1)的概要和OPTIONS的第一段都提到了pathspec。但是pathspec的定义很难找到。它在gitglossary(7)中有描述。 - lrineau
@user815423426 抱歉。我看到了你的编辑,确实我给出的 git-add(1) 链接是不同版本的。在我的机器上,我有 Git-1.8.3 及其文档页面,它确实提到了 pathspec。旧版本则提到了 filepattern。 - lrineau

4
(此答案最初提到refspecs,后来证明这是不相关和不正确的。)
正如 lrineau's answer 所指出的那样,在这种情况下,: 字符是路径规范语法的一部分。
路径规范的文档很难找到,但有一个“git词汇表”手册,可以通过输入 man gitglossary 或访问 this web page 获得。
相关部分:
一个以冒号:开头的路径规范有特殊意义。在短格式中,前导冒号:后跟零个或多个“魔法签名”字母(可选择由另一个冒号:终止),其余部分为要与路径匹配的模式。如果模式以不能是“魔法签名”的字符开头且不是冒号,则可以省略终止“魔法签名”的可选冒号。
在长格式中... [剪辑]。
“魔法签名”由一个非字母数字的ASCII符号组成。 top /
魔术词top(助记符:/)使模式从工作树的根处匹配,即使您正在从子目录中运行命令也是如此。
结论与我的原始答案相同::/指当前工作树的根目录。

但是 git add 接受路径说明符,而不是引用说明符。 :/ 语法闻起来像是针对旧的 git add 行为的事后解决方法:请参见 https://dev59.com/wWEh5IYBdhLWcg3w12il#21954767 - torek
1
那是一个路径规范而不是引用规范。 - lrineau
@lrineau:请随意编辑我的答案或发表您自己的答案。我使用Git,但我设法避免学习有关refspecs和pathspecs的知识。 - Keith Thompson
我已经改进了我的答案,引用了gitglossary(7),就像你一样。 - lrineau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接