此命令获取所有标记:
git fetch origin --tags
此命令获取特定标记:
git fetch origin refs/tags/1.0.0
但不允许我这样做:
git checkout tags/2.3.18
如何获取单个标签然后执行结帐?
答案 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