检测本地和远程不同步的所有标签

3

有没有一种简单的方法来确定我本地仓库中哪些标签与远程不同步? 这里的不同步是指相同的标签名称在本地和远程指向了不同的提交。导致这种情况的两种方式可能是:

  1. 某人(或某些东西)移动了我之前获取的标签。也许它被删除并重新创建,或者当已存在时强制创建。 (我知道这很不好,但这并不能阻止它发生。)
  2. 我在本地创建了一个标签,然后某人(或某些东西)在我之前在不同的提交上创建了相同的标签名称并将其推送出去。

另一种表述这个问题的方式可能是:

如果我运行以下命令,我的哪些本地标签将被更新:

git fetch origin --tags --force

更新:根据答案,在Git Bash中这个一行命令可以工作:

diff <(git for-each-ref refs/tags --format="%(objectname)%09%(refname)") <(git ls-remote --tags | grep -v "\^{}")

说明:该命令列出所有本地标签,并将其格式化为与ls-remote相同的格式。(%09是一个制表符)然后比较这两个输出。


1
请注意,<(...) 是 Bash 的语法结构;有些 shell 可能没有它。如果您没有它,则需要创建至少一个临时文件,这很麻烦,因此 <(...) 语法更好。 - torek
1个回答

4
“易”是因人而异的:使用git ls-remote --tags命令来列出远程存储库中的标签,使用git for-each-ref refs/tags命令来查看本地标签。比较标签的哈希值(在ls-remote输出中,不带^{}后缀的数字即为哈希值;如果有一个带有后缀的数字,则它是标签最终目标的哈希值)。当名称匹配但哈希值不同时,它们就不同步了。编写一个简单的Shell脚本可以解决这个问题。

1
啊,感谢修复 for-each-ref 的问题,不确定出了什么问题(可能是我偶尔遇到的“太多编程语言”的问题 :-) )。 - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接