检测本地和远程之间不同步的所有标签
Detecting all tags that are out of sync between local and remote
有没有一种简单的方法可以确定我的本地存储库中的哪些标签与远程不同步?不同步是指完全相同的标签名称指向我本地和远程的不同提交。我能想到的两种结束这种情况的方法可能是:
- 有人(或某事)移动了我之前获取的标签。也许它被删除并重新创建,或者它已经存在时被强制创建。 (我意识到这是不受欢迎的,但这并不能阻止它发生。)
- 我在本地创建了一个标签,然后有人(或其他人)在不同的提交上创建了相同的标签名称并在我之前将其推出。
这个问题的另一种表达方式可能是:
如果我运行执行以下命令,我的哪些本地标签将被更新:
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 是制表符。)然后比较两个输出。
“简单”见仁见智:使用git ls-remote --tags
转出远程标签,git for-each-ref refs/tags
查看本地标签。比较标签的哈希ID(在ls-remote
输出中,这是没有^{}
后缀的数字;有后缀的,如果有的话,就是该标签的哈希ID标签的最终目标)。当名称匹配但哈希 ID 不同时,它们不同步。为此编写一个shell脚本会相对简单。
有没有一种简单的方法可以确定我的本地存储库中的哪些标签与远程不同步?不同步是指完全相同的标签名称指向我本地和远程的不同提交。我能想到的两种结束这种情况的方法可能是:
- 有人(或某事)移动了我之前获取的标签。也许它被删除并重新创建,或者它已经存在时被强制创建。 (我意识到这是不受欢迎的,但这并不能阻止它发生。)
- 我在本地创建了一个标签,然后有人(或其他人)在不同的提交上创建了相同的标签名称并在我之前将其推出。
这个问题的另一种表达方式可能是:
如果我运行执行以下命令,我的哪些本地标签将被更新:
git fetch origin --tags --force
更新: 基于
diff <(git for-each-ref refs/tags --format="%(objectname)%09%(refname)") <(git ls-remote --tags | grep -v "\^{}")
说明:该命令列出了所有本地标签,并对其进行格式化,使其使用与ls-remote
相同的格式。 (%09 是制表符。)然后比较两个输出。
“简单”见仁见智:使用git ls-remote --tags
转出远程标签,git for-each-ref refs/tags
查看本地标签。比较标签的哈希ID(在ls-remote
输出中,这是没有^{}
后缀的数字;有后缀的,如果有的话,就是该标签的哈希ID标签的最终目标)。当名称匹配但哈希 ID 不同时,它们不同步。为此编写一个shell脚本会相对简单。