在2.0版本的git add --update语法中,/(冒号,正斜杠)是什么意思?

时间:2014-02-22 03:04:05

标签: git

几个月前我升级了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 .中一样,但:/ ...除了在此上下文中之外从未见过。这是什么意思?

我一直认为它是一个表情符号,当然情况并非如此?

4 个答案:

答案 0 :(得分:5)

它实际上是现有语法的扩展:这种名称长期以来一直是有效的gitrevisions语法。

以冒号为前缀的名称 1 指的是索引(staging-area)中的路径,就像修订名称后跟冒号和路径引用给定修订中的路径一样:master~3:foo是分支foo中三个修订版之前的文件master的版本。所以:foo是为下一次提交暂存的foo版本。

但是,请注意,冒号后跟斜杠通常用于通过提交日志消息搜索提交,如gitrevisions中的:/fix示例。

这些路径名通常根植于树的顶部(而不是工作树中的任何位置)。例如,如果您的存储库只有两个文件,但它们的名称为READMEdir/sub.txt且您位于dir,则仍然会写master~3:dir/sub.txtmaster~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;来表示否定匹配,   被选中为将来的其他修饰符留出空间。

new git/revisions doc现在声明:

  

为了匹配以字符串开头的消息,可以使用例如&#39; :/^foo&#39 ;.
  特殊序列&#39; :/!&#39;保留用于匹配的修饰符:

     
      
  • &#39; :/!-foo&#39; 执行否定匹配
  •   
  • while&#39; :/!!foo&#39;匹配文字&#39;!&#39;字符,后面跟着'foo&#39;。
  •   
  • 以&#39; :/!&#39;开头的任何其他序列暂时保留。
  •