git add -A:/在Git 2.X上以及与pathspec的关系

Jos*_*osh 6 git

我已经在几个地方读过,随着时间的推移,行为git add -A 发生了一些变化.

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

she*_*ngy 5

git add -A :/即使您当前不在顶级项目文件夹中,也会将所有更改添加到索引中。但在后来的 git 版本中,它是一样的git add -A

\n\n

假设你有这样的项目:

\n\n
\xe2\x9e\x9c  top git:(master) tree .\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 b.c\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 subfolder\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 a.c\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后您更改了 中的代码b.c,但您当前处于subfolder

\n\n
\xe2\x9e\x9c  subfolder git:(master) \xe2\x9c\x97 git st\nOn branch master\nChanges not staged for commit:\n  (use "git add <file>..." to update what will be committed)\n  (use "git checkout -- <file>..." to discard changes in working directory)\n\n    modified:   ../b.c\n\nno changes added to commit (use "git add" and/or "git commit -a")\n
Run Code Online (Sandbox Code Playgroud)\n\n

git add .现在运行不会添加b.c到您的索引,旧的git add -A不会。但在较旧的 git 中,就可以了。git add -A :/

\n\n
\n

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

\n
\n\n

欲了解更多信息,请阅读\n git help add\ngit help gitglossary

\n


Von*_*onC 5

从git 2.0开始,git add -Agit add -A :/都是一样的。
但是神奇的路径规范:/并不是新的,可以追溯到 git 1.7.6(2011 年 4 月)。请参阅提交 8a42c98。它记录在Documentation/glossary-content.txt

以冒号开头的路径规范:具有特殊含义。
在简短形式中,前导冒号:后跟零个或多个“魔术签名”字母(可选地以另一个冒号终止:),其余部分是与路径匹配的模式。

:top: or :/
Run Code Online (Sandbox Code Playgroud)

魔术字top(魔术签名:)/使模式从工作树的根开始匹配,即使您从子目录中运行命令也是如此。


请注意,如果您想添加一个名为 ' :/' ( git add -A :/)的文件夹,这只能在 git 2.7(2015 年 11 月)中实现,
请参阅Junio C Hamano ( )提交的 29abb33(2015 年 10 月 25 日gitster

从 Git 2.0 开始," add -u" 和 " add -A" 从没有任何路径规范的子目录运行意味着“工作树中的所有内容”(在 2.0 之前,它们仅限于当前目录)。当最终用户没有给我们任何路径规范时,通过在命令行中
插入“ .”来实现对当前目录的限制。
在 2.0 中,我们更新了代码以插入“ :/”(而不是“ .”)以通过使用路径规范魔术“ top”来考虑顶级的所有内容。

(这不再需要,并在所说的提交 29abb33 中修复:即将到来的 git 2.7git add -A不再使用的实现:/

顺便说一句,这种简化还修复了一个角落案例错误,该错误源于“ :/”不一定意味着任何魔法。
当用户git --literal-pathspecs add -u :/有一个目录 ' :' 并想在其中添加所有内容时,用户会从命令行说“ ” (并且她知道她:/将被视为“阳光下的一切”魔法路径规范,除非她使用 禁用魔法--literal-pathspecs)。

:/当使用“--literal-pathspecs”运行时,' '的内部使用与明确给出的“:/”的行为方式相同,并且不会像代码最初预期的那样在阳光下添加所有内容。

由于:/不再使用内部使用, agit --literal-pathspecs add -u :/将实际工作,并在名为“列”(' :')的文件夹下添加文件。