【问题标题】:git add -A :/ on Git 2.X and relationship with pathspecgit add -A :/ 在 Git 2.X 上以及与 pathspec 的关系
【发布时间】:2015-11-04 06:12:22
【问题描述】:

我在several places 中读到git add -A has changed 的行为随着时间的推移而有所改变。

从 2.x 开始(例如 Git 2.5.0),git add -A :/ 究竟做了什么?我在the documentation 中找不到选项::/。是pathspec 吗?为何如此?文档提供的示例仅显示 glob 模式(例如 *.c)或简单的路径规范(例如 dirdir 下添加任何内容)。

【问题讨论】:

标签: git


【解决方案1】:

由于 git 2.0,git add -Agit add -A :/ 是相同的。
但是神奇的 pathspec :/ 并不是新的,可以追溯到 git 1.7.6(2011 年 4 月)。见commit 8a42c98。它记录在Documentation/glossary-content.txt

以冒号 : 开头的路径规范具有特殊含义。
在简写形式中,前导冒号: 后跟零个或多个“magic 签名”字母(可选地以另一个冒号 : 结尾), 余数是匹配路径的模式。

:top: or :/

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


请注意,如果您想添加一个名为“:/”(git add -A :/)的文件夹,这只能在 git 2.7(2015 年 11 月)中实现
commit 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)

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

当使用“--literal-pathspecs”运行时,“:/”的内部使用与显式给定的“:/”的行为方式相同,并且不会按照代码最初的意图添加所有内容.

由于 :/ 的内部使用已不复存在,git --literal-pathspecs add -u :/ 将真正起作用,并在名为“column”(':')的文件夹下添加文件。

【讨论】:

  • 谢谢VonC,当你在上面说"(This is no longer needed, and fixed in that commit)"时你到底指的是什么?紧随其后的是什么?
  • @Josh 我指的是github.com/git/git/commit/…:它的实现(git add -A)在即将到来的 git 2.7 中不再使用:/,它允许git add -A :/ 实际上能够添加一个名为:/ 的文件夹(而不是在提交之前被:/ 内部用于git add -A 的魔术路径覆盖)
【解决方案2】:

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

假设你的项目是这样的:

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

然后你在b.c改了代码,但是你现在在subfolder

➜  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 选项时没有给出路径规范,则 更新整个工作树(旧版本的 Git 用于限制 当前目录及其子目录的更新)。

更多信息,请阅读 git help add git help gitglossary

【讨论】:

    猜你喜欢
    • 2014-09-26
    • 2013-07-17
    • 1970-01-01
    • 2018-07-09
    • 2010-10-09
    相关资源
    最近更新 更多