从远程存储库中获取单个标记

时间:2017-07-26 22:31:18

标签: git git-checkout git-tag git-fetch

此命令获取所有标记:

git fetch origin --tags

此命令获取特定标记:

git fetch origin refs/tags/1.0.0

不允许我这样做:

git checkout tags/2.3.18

如何获取单个标签然后执行结帐?

3 个答案:

答案 0 :(得分:24)

  

git fetch origin refs/tags/1.0.0

这是失败的,因为它没有写一个本地引用:它获取远程的refs/tags/1.0.0,以及随之而来的任何标记对象,提交等;它将那些放入FETCH_HEAD(因为所有git fetch命令总是这样做);并且......那就是它。它永远不会在您的存储库中创建引用refs/tags/1.0.0,即使它获得了所需的一切。

如果它尚不存在,则使其创建这样的标记:

git fetch origin refs/tags/1.0.0:refs/tags/1.0.0

冒号右侧的名称是Git将在您的存储库中使用的名称。例如,您可以将此标记转换为名为wacky的分支,方法是将其命名为refs/heads/wacky。 (没有理由这样做。我只是为了说明而对此进行描述。)

这是非强制提取,因此如果您已经拥有 refs/tags/1.0.0,您的Git将拒绝更新您的参考。如果您要覆盖任何现有的1.0.0代码,请使用:

git fetch origin +refs/tags/1.0.0:refs/tags/1.0.0

如果您希望获取所有标签,无论是否覆盖:

git fetch origin 'refs/tags/*:refs/tags/*'

带或不带前导加号。 (注意:引号只是为了保护你的*。加号可以在引号的内部或外部。实际上,只要它们包围所有的星号或其他shell,引号本身就可以去任何地方元字符:

refs/tags/'*:refs/tags/*'

或者您可以使用反斜杠:

refs/tags/\*:refs/tags/\*

在所有情况下,我们只是保护敏感的星号不受贝壳的影响而且星号很好吃,让它们吃掉它们#34;功能。)

答案 1 :(得分:2)

当您为git fetch指定显式引用时,您需要在refspec中提供映射,或者使用FETCH_HEAD中记录的已获取ID进行操作。

使用无映射提供的情况对获取的引用没有默认处理的优点是,无映射提供的情况对获取的引用没有默认处理。你可能会欣赏

git fetch origin v2.3.18
git tag v2.3.18 FETCH_HEAD    # ← git tag !$ FE<TAB>

当你真的只想要在你的本地仓库中设置一个标签时,原始仓库中没有多少先前的标签指向获取的历史记录。

答案 2 :(得分:1)

我阅读了所有答案,但是还没有提到一种语法糖。如果您只需要获取一个标签作为标签(以便稍后结帐),则可以编写,例如refs/tags/2.3.18

git fetch origin tag 2.3.18 --no-tags

这是已经提到的快捷方式:

git fetch origin refs/tags/2.3.18:refs/tags/2.3.18 --no-tags

当然,如果您需要其他标签(根据默认行为),或者已经在--no-tags命令或{{1中设置了--no-tag,则可能不使用clone }}配置选项(tagOpt)。

man git-clone