gpt4 book ai didi

git - 2.0 版本的 git add --update 语法中 :/(colon, 正斜杠是什么意思?

转载 作者:太空狗 更新时间:2023-10-29 12:52:14 32 4
gpt4 key购买 nike

几个月前我升级了 Git,从那以后我在尝试时收到了以下弃用通知 git add --update :

Warning: The behavior of 'git add --update (or -u)' with no path argument from a subdirectory of the tree will change in Git 2.0 and should not be used anymore. To add content for the whole tree, run:

git add --update :/ (or git add -u :/)

To restrict the command to the current directory, run:

git add --update . (or git add -u .)

With the current Git version, the command is restricted to the current directory.



警告本身非常有意义,它为我节省了一些重置时间。我已经习惯输入 .:/ ,但仍然觉得后者很奇怪,因为它与我遇到的任何其他命令行语法都不一样。 .是一个很好的标记:它只是意味着“当前目录”,就像在 find . 中一样,但是 :/ ... 从未见过,除非在这种情况下。这是什么意思?

我一直认为它是一个表情符号,当然不是这样吗?

最佳答案

编辑,2019 年 11 月 :我已经替换了这个答案,因为原来的答案比正确的多,真的。
:/ git add 的语法使用 Git 所谓的路径规范。路径规范在 the gitglossary 中定义.值得一提的是::/gitrevisions syntax 中有完全不同的含义,它被许多其他命令使用,但不被 git add 使用.对于这些其他用途,请参阅 VonC's answer .

在路径规范中,冒号字符 :后面应该是各种修饰符的长形式或短形式。在修饰符之后,剩下的要么是一个模式,要么是一个被视为文件名的简单字符串。
:/使用缩写形式。在缩写形式中,冒号后的每个识别字符都有一些特殊的含义。 /字符意味着在工作树的顶部。 1

冒号后任何无法识别的字符都是剩余内容的一部分。在这种情况下,整个序列是冒号和斜线,所以没有留下任何东西。但是,如果您写了 :/README ,这意味着工作树顶部的文件自述文件。

也就是说,假设您位于名为 sub/ 的子目录(子文件夹)中。 ,它有一个 README文件也是如此。然后:

git add README

添加 sub/README (因为你在 sub ),但是:
git add :/README

要么:
git add ../README

添加顶级文件。

对于每个短格式表达式,都有一个长格式变体。不过,也有没有短格式的长格式变体。要使用长格式变体,请先写一个冒号,然后是一个左括号 ( , 然后是任意多的长格式名称,以逗号分隔。以克隆括号结束序列 ) .2 例如,你可以写 :(top,icase)readme表示名为 readme 的文件, 或 ReadMe , 或 README ,或任何其他疯狂的混合案例,在工作树的顶部。一些命令行解释器可能需要括号表达式周围的引号: git add ":(top,icase)readme" .

在这种特殊情况下,空字符串与 . 具有相同的含义。到 Git。所以 :/::(top)表示与 :/:. 相同或 :(top). .这会命名工作树中的每个文件。3 离开终止 :在 pathspec 语法中是可以的,所以 :/也意味着工作树中的每个文件。

1至少目前只有两个特殊字符, !^ ,都表示“排除”。所以用冒号形式,你可以写 :/:^:! ,或将它们与 :/! 结合使用.

你可以用第二个冒号终止缩写形式,即你可以写 :/:!如果要添加名为 ! 的文件那是在工作树的顶部。路径规范 :/!:!表示不添加文件 !那是在树的顶端;这仅在您说添加多个树顶文件时才有意义,例如, git add :/!:! :/:.将添加除顶级文件之外的所有文件 ! .

2 不要在长格式的末尾添加另一个冒号。即, :/:是正确的,并且 :(top)是正确的,但是 :(top):是错的!这让我时不时地绊倒。

3平常 .gitignore规则当然适用。请记住,任何被跟踪的文件——任何现在在索引中的文件——都不会被忽略!

侧边栏:删除的文件

我记得,Git 1.x 和 2.0 在处理上一次提交中的文件方面有所不同,当前正在跟踪(即,存在于索引中,例如可以通过 git ls-files --stage 看到),但是——无论出于何种原因——现在不在工作树中。

Git 2.0 中的行为是从工作树中删除的文件往往会从索引中删除。例如,假设我们运行:
$ git checkout master

并获取一个名为 file 的文件由于 master 的提示提交,在工作树中包含名为 file 的文件.然后我们这样做:
$ rm file

以便 file仍然在索引中,但不再在工作树中。一个 git status此时会说:
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

deleted: file

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

各种形式 git add现在将删除文件 file从索引。这包括 git add :/以及 git add file :
$ git add :/
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

deleted: file

如果您不想将此删除“添加”到索引中,您有多种选择,包括 --ignore-removal选项:
$ git reset --hard
HEAD is now at 29c2e68 initial
$ git add --ignore-removal :/
$ git status
On branch master
nothing to commit, working tree clean

因此,如果您使用的是 :/但想跳过更新(即删除)已删除的文件,请使用 --ignore-removal . Git 2.x 中的默认设置也是“添加删除”。

关于git - 2.0 版本的 git add --update 语法中 :/(colon, 正斜杠是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21949074/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com