几个月前我升级了Git,从那时起我尝试git add --update
时就收到了以下弃用通知:
警告:没有路径的'git add --update(或-u)'的行为 树的子目录中的参数将在Git 2.0和 不应该再使用了。要为整个树添加内容,请运行:
git add --update:/(或git add -u:/)
要将命令限制为当前目录,请运行:
git add --update。 (或git add -u。)
使用当前的Git版本,命令仅限于当前 。目录
警告本身非常有意义,它为我节省了一些重置。我已经习惯了输入.
或:/
,但仍然发现后者非常奇怪,因为它与我遇到的任何其他命令行语法不同。 .
非常令牌:它只是意味着“当前目录”,就像在find .
中一样,但:/
...除了在此上下文中之外从未见过。这是什么意思?
我一直认为它是一个表情符号,当然情况并非如此?
答案 0 :(得分:5)
它实际上是现有语法的扩展:这种名称长期以来一直是有效的gitrevisions语法。
以冒号为前缀的名称 1 指的是索引(staging-area)中的路径,就像修订名称后跟冒号和路径引用给定修订中的路径一样:master~3:foo
是分支foo
中三个修订版之前的文件master
的版本。所以:foo
是为下一次提交暂存的foo版本。
但是,请注意,冒号后跟斜杠通常用于通过提交日志消息搜索提交,如gitrevisions中的:/fix
示例。
这些路径名通常根植于树的顶部(而不是工作树中的任何位置)。例如,如果您的存储库只有两个文件,但它们的名称为README
和dir/sub.txt
且您位于dir
,则仍然会写master~3:dir/sub.txt
和master~3:README
。您可以通过强制使用相对路径名dir/
和git show master~3:./sub.txt
来自动调查git show master~3:../README
。使用:/fix
意味着搜索提交消息,此处不能使用前导斜杠来表示树的顶部,但由于路径名始终从顶部开始,因此不需要。
但是在git add
的情况下,你实际上并不是指现在上演的内容 - 你正在尝试添加的东西,为了上演它,为什么会是什么? staged now 重要吗?-so :path
表示在当前树中添加文件。出于一些古怪的原因, 2 与其他git命令不同,git add
基于你当前的工作目录工作,即使使用冒号语法,所以如果你在dir/
并且你写git add :sub.txt
它会添加./sub.txt
。你不能从这里git add :README
。但你可以(至少使用git 1.8-我不确定它已经存在了多长时间)git add :/README
,其中前导斜杠意味着“转义当前子目录并转到存储库树的顶部改为“。
如果删除路径名的其余部分,则会得到:/
- 这看起来确实像一个表情符号!但它引用了存储库顶部的目录。但仅适用于git add
;对于其他git命令,它表示提交消息搜索字符串。
1 含义,“并非总是如此”。 Git对其许多规则的例外通常是明智的,但是难以解释。 : - )
2 意思是“我不知道为什么”。当然,对于非 - 色彩前缀路径是有意义的,但对于以冒号为前缀的路径,为什么呢? (考虑到一堆现有代码,它可能更容易实现。)
答案 1 :(得分:1)
:/
不是唯一的新语法,你也有
:!
:(exclude)
Making 'git log' ignore changes for certain paths
因此:
表示路径规范紧随其后。然后你有/
,也称为
root directory,或者在这种情况下代表存储库的根目录。
答案 2 :(得分:1)
first answer并不完全正确。在git-add
的上下文中,:/
不能是修订版。这是一个 pathspec 。请参阅my answer相关问题“What does "git add -A :/" do?”。
pathspec 在gitglossary(7)中定义。
答案 3 :(得分:1)
:/
符号在git 2。8(2016年3月)中演变为&#39; ^{/!-<negative pattern>}
&#39;表示法::/!-foo
commit 0769854(2016年1月31日)和commit 06b6b68(2016年1月10日)Will Palmer (wpalmer
)。
(由Junio C Hamano -- gitster
--合并于commit fb79532,2016年2月10日)
要命名提交,您现在可以使用
:/!-<negative pattern>
正则表达式 风格,并相应地说,
$ git rev-parse HEAD^{/!-foo}
它将返回可从HEAD到达的第一个提交的哈希, 其提交消息不包含&#34;
foo
&#34;。
这与现有的<rev>^{/<pattern>}
语法相反。此用途的具体用例是执行操作,不包括包含特定标记的最新提交。
例如,如果您倾向于使&#34;正在进行中工作&#34;提交,以&#34;WIP
&#34;开头的消息,你工作,然后对#34;最近的提交不是WIP
提交&#进行差异可能是有用的34 ;.
现在可以通过以下命令实现这一点:
$ git diff @^{/!-^WIP}
领导者&#39;
/!-
&#39;而不是简单地用/!
&#39;来表示否定匹配, 被选中为将来的其他修饰符留出空间。
为了匹配以字符串开头的消息,可以使用例如&#39;
:/^foo
&#39 ;.
特殊序列&#39;:/!
&#39;保留用于匹配的修饰符:
- &#39;
:/!-foo
&#39; 执行否定匹配,- while&#39;
:/!!foo
&#39;匹配文字&#39;!&#39;字符,后面跟着'foo&#39;。- 以&#39;
:/!
&#39;开头的任何其他序列暂时保留。