likes
comments
collection
share

「一文搞定」 Git 批量删除分支和 tag

作者站长头像
站长
· 阅读数 14

前言

相信大家在公司团队里面,项目分支和 tag,都会有对应的相关规则,比如,功能分支命名为 feature-* 等等。

按照对应的规则进行项目开发后,随着时间越来越长,团队内部没有对应的规范对分支和标签进行管理,那会出现项目中的分支和标签数量急剧增长,这样也不利于项目维护。

我就遇到类似的问题,接手的项目仓库的分支和标签很多,那就开搞吧。

一开始的想法

本来是打算项目的分支和标签不多的情况下,可以在 gitlab 上面进行手动删除或者使用对应的命令行删除,我初始想法就是在 gitlab 上面进行手动删除,然后在 gitlab 上面操作下,发现不管是删除分支还是删除标签,都是需要二次确认,才真正删除掉。类似下图这样

「一文搞定」 Git 批量删除分支和 tag

我想如果自己一个个手动删除的话,好麻烦啊,另外那这样花的时间很多,也不划算。本着简单解决的原则,其实就是想偷懒,那就想办法看怎么批量删除分支和标签。

删除分支

注:这里的删除,是包括远程和本地的。

目前想到的删除分支规则:

  1. 把符合条件的分支,给删除掉
  2. 除了某些分支不删除,其他无用分支都删除,比如,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

参考资料