【问题标题】:Fetch a single tag from remote repository从远程存储库中获取单个标签
【发布时间】:2018-01-02 10:58:52
【问题描述】:

此命令获取所有标签:

git fetch origin --tags

此命令获取特定标签:

git fetch origin refs/tags/1.0.0

但是我做不到:

git checkout tags/2.3.18

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

【问题讨论】:

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


    【解决方案1】:

    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 将在存储库中使用的名称。您可以将此标记转换为名为@9​​87654327@ 的分支,例如,将其命名为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 的“星号很好吃,让我们吃掉它们”功能。)

    【讨论】:

    • 当我尝试 git 似乎不仅获取我指定的标签,还获取所有历史标签(可能达到指定的?)。有没有办法将获取的标签数量限制为 1?
    • @Sah:准确地说,你运行了什么命令?使用--no-tags 告诉git fetch 不要自动获取它将获取的“额外”标签;使用 --tags 告诉它获取 all 标签。您也可以在配置中设置remote.<name>.tagOpt
    • 我跑的是git fetch origin refs/tags/1.0.0:refs/tags/1.0.0--no-tags 解决了我的问题。非常感谢!
    • 好的。 Git 的标签更新对我来说有点神秘:我在源代码中进行了研究,它们是由特殊情况代码以及正常的引用更新代码完成的。特殊情况代码在不同的 Git 版本中可能表现不同。使用 --no-tags 会抑制特殊情况代码。
    • 我要补充的一点是,如果您在看到有关使用git fetch origin refs/tags/1.0.0:refs/tags/1.0.0 的提示之前已经完成了git fetch origin refs/tags/1.0.0,您仍然可以使用命令git tag 1.0.0 FETCH_HEAD 创建标签(假设您没有'从那以后没有获取任何其他东西)。
    【解决方案2】:

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

    git fetch origin tag 2.3.18
    

    【讨论】:

    • 作为参考,这在<refspec>git help fetch手册页描述中有所提及。
    • 并且在 Git v1.0 之前支持这种快捷表示法。 github.com/git/git/commit/…
    【解决方案3】:

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

    no-mapping-provided case 对获取的 refs 不进行默认处理的优点是,no-mapping-provided case 对获取的 refs 不进行默认处理。你可能会感激

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

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

    【讨论】:

    • 您似乎在第二段中重复了自己。
    猜你喜欢
    • 2018-10-27
    • 1970-01-01
    • 2011-04-08
    • 2019-03-10
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多