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

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

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

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

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


当前回答

这是一个很好的方法:

Git标签-l | xargs Git标签-d && Git获取-t

来源:demisx.GitHub.io

其他回答

这是一个很好的方法:

Git标签-l | xargs Git标签-d && Git获取-t

来源:demisx.GitHub.io

这样如何-删除所有本地标签,然后重新获取? 考虑到你的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

从Git v1.7.8到v1.8.5.6,你可以这样使用:

git fetch <remote> --prune --tags

更新

这在较新的git版本(从v1.9.0开始)上不起作用,因为提交了e66ef7ae6f31f2。我并不想删除它,因为它确实对一些人有用。

根据“Chad Juliano”的建议,对于v1.7.8以来的所有Git版本,您可以使用以下命令:

git fetch --prune <remote> +refs/tags/*:refs/tags/*

你可能需要用引号将标签部分括起来(例如在Windows上),以避免通配符展开:

git fetch --prune <remote> "+refs/tags/*:refs/tags/*"

注意:在所有这些情况下,可能是“origin”或任何您通常引用的远程。

看起来Git的最新版本(我使用的是Git v2.20)允许人们简单地说

git fetch --prune --prune-tags

多干净!

https://git-scm.com/docs/git-fetch#_pruning

你也可以配置git在抓取时总是修剪标签:

git config fetch.pruneTags true

如果您只想在从特定的远程获取时修剪标签,您可以使用remote.<remote>。pruneTags选项。例如,当从原点读取而不是从其他遥控器读取时,总是修剪标签,

git config remote.origin.pruneTags true

Git本身支持清除本地标记

git fetch --tags --prune-tags

该命令提取最新的标记并删除所有已删除的标记