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

Fetch a single tag from remote repository

此命令获取 所有 个标签:

git fetch origin --tags

此命令获取特定标签:

git fetch origin refs/tags/1.0.0

但是我做不到:

git checkout tags/2.3.18

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

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 的影响。加号可以在引号内或引号外。事实上,引号本身可以放在任何地方,只要它们包围所有星号或其他 shell 元字符:

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

或者您可以改用反斜杠:

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

在所有情况下,我们只是保护敏感星号免受 shell 的 "asterisks are tasty, let's eat them" 函数影响。)

当您指定 git fetch 的显式引用时,您需要在 refspec 中提供一个映射,或者您自己使用记录在 FETCH_HEAD 中的获取 ID 执行您想要的操作。

让未提供映射的情况不对获取的 ref 进行默认处理的优点是,未提供映射的情况对获取的 ref 不进行默认处理。你可能会喜欢

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

当您真的只想在本地存储库中设置一个标签,而不是原始存储库中的许多先前标签指向获取的历史记录时。

我看了所有的答案,但还没有提到一个语法糖。如果您只需要获取一个标签作为标签(稍后结帐),您可以编写,例如 for 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

当然,如果您需要其他标签(根据默认行为)或者如果您已经在 clone 命令中或在tagOpt 配置选项(man git-clone).

git fetch origin tag 2.3.18