如果git标记在远程更改,则git fetch不会在本地更新它。这是一个错误吗?

时间:2011-12-08 14:59:37

标签: git

我通过删除本地标记然后执行git fetch来修复它以用于我的repo。这带来了更新的标签。

是否有“正确”的方式来更新遥控器上可能已更改的标签?这是一个简单的标签,没有签名或任何东西,用“git tag”

创建

6 个答案:

答案 0 :(得分:67)

确保获取所有标记(通过git fetch --tags),以获取所有标记,而不仅仅是引用从分支头部可以访问的提交。

那些(获取的)标签是annotated ones (and usually not lightweight),如果你在本地仓库中添加了已删除的标签,它们只会在提取后弹出。

但是,如果你删除了一个轻量级的,那么你需要在本地重新创建它:一个轻量级的标签通常通常推送到远程仓库或从远程仓库中取出。

请注意,启动git 1.9 / 2.0(2014年第一季度),git fetch --tags将获取所有内容(例如git fetch)以及标记。请参阅“Does “git fetch --tags” include “git fetch”?”。

同样,获取“所有内容”意味着注释和轻量级(如果先前推送了那些轻量级标签)。


如下面biocybermananswer所述,如果您想从所有遥控器(而不仅仅是名为“origin”的默认遥控器中提取标签),您需要添加--all option

git fetch --tags --all

答案 1 :(得分:7)

你所说的是正确的方式,这就是git tag手册推荐的内容(实际上,它说,除非世界即将结束,否则不要更改远程仓库上的标签):< / p>

git tag -d X
git fetch origin tag X

答案 2 :(得分:6)

我认为正确的方法是:

  git fetch origin --tags --force

您应该避免具有相同标记名称的分支,因为结帐优先考虑分支,您可能会因为标记未更新而崩溃。在这种情况下,git应该有警告,例如:

  

您已更新了现在与其分支不同的标记   同名。对“标记名”的引用变得含糊不清。

答案 3 :(得分:2)

实际上 git fetch --tags 足以让git用任何一种远程标签覆盖轻量级和带注释的标签。您可以将其视为文档错误,因为没有提及。

使用此命令将保留名称在rempote上没有等效的本地标记。

使用git版本2.7.4进行测试。

答案 4 :(得分:1)

我不认为这是一个错误。虽然您不应更改标签,但如果更改标签,则会更新您的存储库上的标签:

git fetch origin "+refs/tags/*:refs/tags/*"

答案 5 :(得分:1)

如果一个人有多个上游:

git --version
git version 2.11.1 
git fetch --tags --all

没有--all选项,我无法从名称不是“上游”的上游获取标签。