我们在git中使用标签作为部署过程的一部分。有时,我们希望通过从远程存储库中删除这些标记来清理它们。

这很简单。一个用户在一组命令中删除了本地标签和远程标签。我们有一个结合了这两个步骤的shell脚本。

第二个(第3个,第4个,……)用户现在拥有不再反映在远程上的本地标记。

我正在寻找一个类似于git远程修剪起源的命令,清理本地跟踪分支,其中远程分支已被删除。

或者,可以使用一个简单的命令来列出远程标记,与通过git tag -l返回的本地标记进行比较。


当前回答

在新的git版本(如v2.26.2或更高版本)中,您可以使用——prune-tags

- p ——prune-tags 在获取之前,如果启用了——prune,则删除远程上不再存在的任何本地标记。这个选项应该更谨慎地使用,不像——prune它将删除已经创建的任何本地引用(本地标记)。这个选项是提供显式标记refspec和——prune的简写,请参阅其文档中关于它的讨论。

所以你需要运行:

git fetch origin --prune --prune-tags

其他回答

我知道我迟到了,但现在有一个快速的答案:

git fetch --prune --prune-tags # or just git fetch -p -P

是的,它现在是一个获取的选项。

如果你不想获取,只需修剪:

git remote prune origin

与@Richard W的答案相同,但适用于Windows (PowerShell)

git tag | ForEach-Object -Process { git tag -d $_ }
git fetch -t

自v1.7.8以来的所有版本的Git都理解使用refspec来获取Git,而自v1.9.0以来——tags选项覆盖了——prune选项。对于一个通用的解决方案,试试这个:

$ git --version
git version 2.1.3

$ git fetch --prune origin "+refs/tags/*:refs/tags/*"
From ssh://xxx
 x [deleted]         (none)     -> rel_test

有关“——tags”和“——prune”行为在Git v1.9.0中如何改变的进一步阅读,请参见:https://github.com/git/git/commit/e66ef7ae6f31f246dead62f574cc2acb75fd001c

这样如何-删除所有本地标签,然后重新获取? 考虑到你的repo可能包含子模块:

git submodule foreach --recursive  'git tag | xargs git tag -d'
(alternatively, "for i in `find .git  -type d -name '*tags*'`; do rm -f $i/*;  done")
git fetch -t
git submodule foreach --recursive git fetch -t

TortoiseGit现在可以比较标签了。

左边是远程日志,右边是本地日志。

使用同步对话框的比较标签功能:

另见TortoiseGit 2973期