作者:亲爱的jackvan叔叔 | 来源:互联网 | 2022-12-29 13:53
我正在尝试删除X个月以上的git标签
我们有需要保留的发行标签,它们都标记release-*
在* = date
我知道如何删除单数标签 git push origin :refs/tags/
所以我推断出要删除所有远程标签
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 $( \
| sed -e 's/^/:/' | paste -sd " ")
这样,该命令基本上将被追加:refs/tags/tag1 :refs/tags/tag2
到单个命令中,而不是对每个标签进行唯一的删除并与远程控制器联系。
1> wiredniko..:
经过几天的研究,我找到了一个很好的解决方案。
首先按时间顺序收集所有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
因此,它是标记的名称,中间用空格隔开,然后是YYYY-MM-DD
格式的日期。如果您想要一个完整的日期或taggerdate:short
某些适当的特定更新。
然后,我获取输出并逐行处理日期,并将其与我的截止日期进行比较。
这使我可以生成要删除的标签列表。
然后,我通过遍历标签列表并执行以下命令来运行删除操作
git push origin :refs/tags/ :refs/tags/
我很安全地运行它,每隔50个标签运行一次命令,但是git似乎对此没有任何问题。
最后,在完成所有删除操作后,我
git fetch --prune origin +refs/tags/*:refs/tags/*
将删除远程中不存在的所有本地标签。
在那里,所有标签都被清理了。