如何更新本地标签以匹配远程?
Posted
技术标签:
【中文标题】如何更新本地标签以匹配远程?【英文标题】:How to update local tags to match remote? 【发布时间】:2012-01-16 00:07:48 【问题描述】:我通过删除本地标记然后执行 git fetch 为我的 repo 修复了它。这带来了更新的标签。
是否有“正确”的方法来更新遥控器上可能已更改的标签?这是一个简单的标签,没有签名或任何东西,用“git tag”创建
【问题讨论】:
【参考方案1】:确保获取所有标签(通过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
”?”。
再次,获取“所有内容”意味着注释和轻量级(如果之前推送了这些轻量级标签)。
正如下面biocyberman 的answer 中所述,如果您想从所有 遥控器(不仅仅是名为“origin
”的默认遥控器)获取标签,您需要添加--all
option。
git fetch --tags --all
【讨论】:
您能否包含对此的引用:“轻量级标签不会被推送到远程仓库或从远程仓库获取。” ?我在文档中没有找到该行为的参考。 @yucer 我的意思是(5 年前)轻量级标签不应该被推/拉:git-scm.com/docs/git-tag“带注释的标签用于发布,而轻量级标签用于私有或临时对象标签。因此,一些用于命名对象的 git 命令(如 git describe)默认会忽略轻量级标签。" @yucer 例如: git push 不推送任何标签。 git-scm.com/docs/git-push:但是git push --follow-tags
?它只推送缺少的 annotated 标签。不轻。按设计。
事实上,轻量级标签是从远程仓库获取的。 (一个简单的git fetch
就足够了。)获取的标签正是它们在遥控器上的样子:轻量级或带注释的。 (git 版本 2.7.4)
git fetch --tags
也会获得轻量级标签,当然如果它们被推送的话;我认为答案不应该说它们不是git fetch --tags
【参考方案2】:
在 git 2.30 之前,正确的做法似乎是:
git fetch origin --tags --force
你应该避免一个标签名称相同的分支,因为结账会优先考虑这个分支,你会感觉标签没有更新。在这种情况下,也许 git 应该有一个警告,比如:
您更新了一个标签,该标签现在不同于 同名。对“标记名”的引用变得模棱两可。
【讨论】:
这应该是正确的答案。如果标签已移动,则每个人都需要使用--force来更新他们的本地副本。 好吧,当我在大约 4 个月前使用较旧的 Git 版本时写下该评论时,我相当肯定那是真的,但现在在 Git 2.30 上它似乎不再是真的了.要么那个,要么我的测试有缺陷。有人移动了我已经获取的标签,这个命令不再为我在本地移动它。 我也得到了相同的行为 @TTT ,我也确信它有效。我将编辑答案。谢谢 这很有趣。经过进一步的测试,我意识到我的测试有缺陷。我实际上错了远程标记指向哪个提交。 (我把它倒过来了。)当我从另一台机器上运行这个命令时,它确实工作并更新了它(以及其他一些不同步的)。所以这仍然有效。我在这个测试中使用了 2.30.1。现在我很好奇你是如何确认我有缺陷的测试的? :)【参考方案3】:您所说的是正确的方法,这就是 git tag
手册所建议的(实际上,它说,除非世界即将结束,否则不要更改远程仓库上的标签):
git tag -d X
git fetch origin tag X
【讨论】:
@flybird 是的,这不是一个好主意,但有时我们会犯错误或匆忙做出决定,所以清理远程并使用git tag -l | xargs git tag -d
删除所有本地标签,然后再次获取它们git fetch --tags
我认为最好不要更改所以设置的时候要小心。很多人似乎喜欢drupal.org/node/1015226的drupal指南@
我在手册中找不到对“除非世界即将结束,否则不要更改远程仓库上的标签”的引用。能给个准确的参考吗?我想了解更多关于这个问题的信息。
那个参考在git-scm.com/docs/git-tag#_on_re_tagging,以防4.5年后这仍然是一个问题。 :D【参考方案4】:
如果一个有多个上游:
git --version
git version 2.11.1
git fetch --tags --all
没有--all
选项,我无法从名称不是“上游”的上游获取标签。
【讨论】:
【参考方案5】:事实上 git fetch --tags
足以让 git 用任何一种远程标签覆盖轻量级和带注释的标签。您可以认为这是一个文档错误,因为没有提及。
使用此命令将单独保留远程名称中没有对应名称的本地标签。
用 git 版本 2.7.4 测试。
【讨论】:
在 git v2.23.0 中仅传递--tags
不会覆盖本地标签。我必须添加--force
。【参考方案6】:
我不认为这是一个错误。尽管您不应该更改标签,但如果上游更改了标签,这将更新您的 repo 上的标签:
git fetch origin "+refs/tags/*:refs/tags/*"
【讨论】:
以上是关于如何更新本地标签以匹配远程?的主要内容,如果未能解决你的问题,请参考以下文章
如何禁用分段上传,以便同步匹配 s3cmd 中本地和远程文件的 md5sum
在 Postgres 中,如何匹配多个“标签”以获得最佳性能?