「一文搞定」 Git 批量删除分支和 tag
前言
相信大家在公司团队里面,项目分支和 tag,都会有对应的相关规则,比如,功能分支命名为 feature-* 等等。
按照对应的规则进行项目开发后,随着时间越来越长,团队内部没有对应的规范对分支和标签进行管理,那会出现项目中的分支和标签数量急剧增长,这样也不利于项目维护。
我就遇到类似的问题,接手的项目仓库的分支和标签很多,那就开搞吧。
一开始的想法
本来是打算项目的分支和标签不多的情况下,可以在 gitlab 上面进行手动删除或者使用对应的命令行删除,我初始想法就是在 gitlab 上面进行手动删除,然后在 gitlab 上面操作下,发现不管是删除分支还是删除标签,都是需要二次确认,才真正删除掉。类似下图这样
我想如果自己一个个手动删除的话,好麻烦啊,另外那这样花的时间很多,也不划算。本着简单解决的原则,其实就是想偷懒,那就想办法看怎么批量删除分支和标签。
删除分支
注:这里的删除,是包括远程和本地的。
目前想到的删除分支规则:
- 把符合条件的分支,给删除掉
- 除了某些分支不删除,其他无用分支都删除,比如,master 和 develop 分支
命令浅析
-
git branch -r
:查看远程分支 -
git branch -a
: 查看所有分支包括本地和远程 -
grep -v -E 'master|develop'
:排除 master 和 develop 分支- -v 排除
- -E 使用正则表达式
-
sed 's/origin///g'
:能够把接受到的分支都过滤掉开头的 origin/ 得到实际的分支名 (大概这个意思),比如,origin/A 分支执行了sed 's/origin///g'
命令就能得到 A -
awk '{print ":"$1}'
:打印对应的分支名,比如,:feature-allocation-mode 这样的 -
xargs -I {} git push origin :{}
:将 A 这个分支作为参数传给下一个命令,-I {} 使用占位符 来构造 后面的命令,也就是接收到了上个命令的执行结果 A 执行git push origin :A
-
xargs git branch -D
:强制删除分支,以上面为例,其实就是git branch -D A
类似这样
其中最核心的命令是 |
和 xargs
|
的作用是把前一个命令的输出作为后一个命令的输入
xargs
是把输入作为后一个命令的参数
步骤一:明确要删除的分支,避免误删
这里使用的是第二种方式
git branch -r | grep -v -E 'master|develop' | sed 's/origin\///g' | awk '{print ":"$1}'
步骤二:删除远程分支
git branch -r | grep -v -E 'master|develop' | sed 's/origin\///g' | xargs -I {} git push origin :{}
步骤三:删除本地分支
git branch -a | grep -v -E 'master|develop' | xargs git branch -D
删除标签
注:这里的删除,是包括远程和本地的。
命令浅析
git tag -l
:列出标签awk '/v1\.*[0-2]\.[0-2]/{print}'
:打印出符合条件的标签git push origin --delete tag
:删除远程标签git push origin --delete tag $(git tag -l | awk '/v1\.*[0-2]\.[0-2]/{print}')
:删除符合条件的标签git tag -l | xargs git tag -d
:删除所有本地标签git fetch origin --prune
:从远程拉取所有信息git fetch origin --tags
:同步远程标签到本地
步骤一:根据正则表达式筛选需要删除的标签,避免误删
git tag -l | awk '/v1\.*[0-2]\.[0-2]/{print}'
步骤二:按照上面的正则表达式,批量删除远程标签
git push origin --delete tag $(git tag -l | awk '/v1\.*[0-2]\.[0-2]/{print}')
步骤三:删除本地标签
注:gitlab 上面的远程 tag 删除了,但是本地项目的 tag 还存在,如果 push 这个 tag 到远程,那么此 tag 将永远不会被删除,是为了避免这种情况出现
git tag -l | xargs git tag -d
git fetch origin --prune
git fetch origin --tags
参考资料
转载自:https://juejin.cn/post/7203180600819515451