从远程存储库中获取单个标签
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
此命令获取 所有 个标签:
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