Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 从远程存储库获取单个标记_Git_Git Checkout_Git Tag_Git Fetch - Fatal编程技术网

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

Git 从远程存储库获取单个标记,git,git-checkout,git-tag,git-fetch,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 如何获取单个标记,然后执行签出 git获取原点参考/tags/1.0.0 这会失败,因为它没有写入本地引用:它获取远程的refs/tags/1.0.0,以及与之相关的任何标记对象、提交等;它将这些命令放入FETCH\u HEAD(就像所有git FETCH命令一样)

此命令获取所有标记:

git fetch origin --tags
此命令获取特定的标记:

git fetch origin refs/tags/1.0.0
但这不允许我做:

git checkout tags/2.3.18
如何获取单个标记,然后执行签出

git获取原点参考/tags/1.0.0

这会失败,因为它没有写入本地引用:它获取远程的
refs/tags/1.0.0
,以及与之相关的任何标记对象、提交等;它将这些命令放入
FETCH\u HEAD
(就像所有
git FETCH
命令一样);而且。。。就这样。它从不在您的存储库中创建reference
refs/tags/1.0.0
,即使它获得了所需的一切

要使其在不存在时创建这样的标记,请执行以下操作:

git fetch origin refs/tags/1.0.0:refs/tags/1.0.0
冒号右侧的名称是Git将在存储库中使用的名称。例如,您可以将该标记命名为
refs/heads/wacky
,从而将其转换为名为
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 fetch的显式引用时,您需要在中提供映射,或者自己对
fetch\u HEAD
中记录的获取id执行所需操作

让未提供映射的案例对获取的引用不进行默认处理的优点是,未提供映射的案例对获取的引用不进行默认处理。你可能会感激的

git fetch origin v2.3.18
git tag v2.3.18 FETCH_HEAD    # ← git tag !$ FE<TAB>
git获取源代码v2.3.18
git标签v2.3.18取头← git标签!$铁

当你真的只想在本地回购协议中设置一个标签,而不想在原始回购协议中有几十个先前的标签指向获取的历史时。

我阅读了所有答案,但还没有提到一个语法糖。如果您只需要获取一个标记作为标记(稍后签出),您可以编写,例如
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
配置选项(
mangit clone
)中显式设置了
--no tag
,则不能使用
--no tags


当我尝试git时,它似乎不仅获取了我指定的标记,而且还获取了所有历史标记(直到指定的标记?)。有没有办法将获取的标签数量限制为1个?@Sah:您运行的确切命令是什么?使用
--no tags
告诉
git fetch
不要自动获取它将获取的“额外”标记;使用
--tags
告诉它获取所有标记。您还可以在配置中设置
remote..tagOpt
。我运行的是
git fetch origin refs/tags/1.0.0:refs/tags/1.0.0
。而
--没有标签
解决了我的问题。谢谢!好啊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\u HEAD
(假设从那以后你再也没有拿过任何东西)。你似乎在重复第二段。
git fetch origin tag 2.3.18