删除X个月之前的远程git标签

wir*_*iko 1 git gitlab

我正在尝试删除X个月以上的git标签

我们有需要保留的发行标签,它们都标记release-** = date

我知道如何删除单数标签 git push origin :refs/tags/<tagName>

所以我推断出要删除所有远程标签

git ls-remote --tags origin | xargs git push origin :$1

要跳过我计划使用的发布标签,请使用egrep -v以下命令

git ls-remote --tags origin | egrep -v "(^\*|release*)" | xargs git push origin :$1

但是我至今还没有弄清楚如何做到这一点。

我可以在本地按日期排序,例如,git for-each-ref --sort=taggerdate --format '%(refname)' refs/tags | egrep -v "(^\*|release*)"但这对远程标记没有帮助。

如果有帮助,我不介意删除或不删除本地标签以删除远程标签。

最后,如果它提供了更好的清除方法,我们将使用gitlab?

无论如何,这都需要通过Jenkins像脚本一样运行,以帮助满足git清理的需要。

更新资料

因为我们有成千上万个git标签,所以我意识到xargs将会变得非常慢。

我相信删除的方式更有可能是

git push origin $(< git tag | <sorting_by_date + exclude release> \ | sed -e 's/^/:/' | paste -sd " ")

这样,该命令基本上将被追加:refs/tags/tag1 :refs/tags/tag2到单个命令中,而不是对每个标签进行唯一的删除并与远程控制器联系。

wir*_*iko 6

经过几天的研究,我找到了一个很好的解决方案。

首先按时间顺序收集所有git标签,我排除了release*标签

git for-each-ref --sort=taggerdate --format '%(refname:short) %(taggerdate:short)' refs/tags | egrep -v "(^\*|release*)"

这将给出以下输出

master_7 2017-12-05
master_8 2017-12-05
master_9 2017-12-07
master_10 2017-12-08
master_11 2017-12-08
update_framework_1 2017-12-12
master_12 2017-12-12
master_13 2017-12-13
Run Code Online (Sandbox Code Playgroud)

因此,它是标记的名称,中间用空格隔开,然后是YYYY-MM-DD格式的日期。如果您想要一个完整的日期或taggerdate:short某些适当的特定更新。

然后,我获取输出并逐行处理日期,并将其与我的截止日期进行比较。

这使我可以生成要删除的标签列表。

然后,我通过遍历标签列表并执行以下命令来运行删除操作

git push origin :refs/tags/<tag1> :refs/tags/<tag2>

我很安全地运行它,每隔50个标签运行一次命令,但是git似乎对此没有任何问题。

最后,在完成所有删除操作后,我 git fetch --prune origin +refs/tags/*:refs/tags/*将删除远程中不存在的所有本地标签。

在那里,所有标签都被清理了。