Git 2.X中的git add -A :/命令及其与pathspec的关系

6

我在多个地方看到,git add -A的行为随着时间的推移有些变化

从2.x版本开始(例如Git 2.5.0),git add -A :/到底是做什么的?我在文档中找不到::/选项。它是一个pathspec吗?怎么样?文档提供的示例只显示了glob模式(例如*.c)或简单的路径规范(例如dir以添加dir下的任何内容)。


请搜索 pathspec:http://git-scm.com/docs/gitglossary.html - shengy
2个回答

5
自从git 2.0版本以来,git add -Agit add -A :/是相同的。但是神奇的路径规范:/不是新的,可以追溯到git 1.7.6(2011年4月)。请参见提交8a42c98。它在Documentation/glossary-content.txt中有记录。
以冒号:开头的路径规范具有特殊含义。在短格式中,前导冒号:后跟零个或多个“魔术签名”字母(可选地由另一个冒号:终止),其余部分是要与路径匹配的模式。
:top: or :/

“top”这个神奇的关键词(魔法签名:/)可以使模式从工作树的根目录开始匹配,即使你从子目录内运行命令也可以。
请注意,如果您想添加一个名为':/'的文件夹(git add -A :/),这只有在git 2.7(2015年11月)才能实现。
参见提交29abb33(2015年10月25日)由Junio C Hamano (gitster)。自Git 2.0以来,“add -u”和“add -A”从子目录运行时没有任何路径规范意味着“工作树中的所有内容”(在2.0之前,它们仅限于当前目录)。将限制当前目录的功能是通过在最终用户未提供任何路径规范时将“.”插入到命令行中实现的。在2.0中,我们更新了代码,通过使用路径规范魔术“top”,将“:/”(而不是'.')插入到顶层以考虑一切。
(此方法已不再需要并在提交29abb33中得到修复:git add -A的实现不再使用“:/”用于即将到来的git 2.7)
顺便提一下,这样的简化也修复了一个边角情况的错误,该错误源于“:/”不一定意味着任何魔法。
当用户拥有一个名为“:”的目录并希望添加其中的所有内容时(并且她知道她的“:/”将被视为‘everything under the sun’魔法路径规范,除非她使用--literal-pathspecs禁用魔法),她会从命令行中输入“git --literal-pathspecs add -u :/”。
在运行“--literal-pathspecs”时,“:/”的内部使用方式与显式给出的“:/”相同,并且不会像代码最初预期的那样添加太阳下的所有内容。
由于不再使用“:/”,因此“git --literal-pathspecs add -u :/”将实际起作用,并添加名为“column”的文件夹下的文件。

谢谢VonC,当您上面说“(这不再需要,并在该提交中修复)”时,您指的是什么?接下来是什么? - Josh
1
@Josh 我指的是 https://github.com/git/git/commit/29abb33978f713cd0a5cc3687bf61077b0928840 :在即将到来的 git 2.7 中,它的实现(git add -A)不再使用 :/,这使得 git add -A :/ 实际上能够添加一个名为 :/ 的文件夹(而不是被之前的提交中 git add -A 内部使用的魔法路径 :/ 覆盖)。 - VonC

5

git add -A :/命令会将所有更改添加到索引,即使您当前不在顶级项目文件夹中。但在后续的Git版本中,它与git add -A相同。

假设您的项目结构如下:

➜  top git:(master) tree .
.
├── b.c
└── subfolder
    └── a.c

然后你在b.c中更改了代码,但你现在位于子文件夹

➜  subfolder git:(master) ✗ git st
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   ../b.c

no changes added to commit (use "git add" and/or "git commit -a")

运行git add .不会将b.c添加到索引中,旧的git add -A也一样。但在旧版本的git中,git add -A:/可以解决问题。

如果在使用-A选项时未给出pathspec,则更新整个工作树中的所有文件(旧版本的Git仅限于当前目录及其子目录)。

如需更多信息,请阅读git help addgit help gitglossary

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