背景
我司使用GitLab
来进行Git仓库的管理。但是随着多个开发窗口的迭代,在某个工程里遗留了很多没有及时清理的开发分支。
即非活跃的分支,比如:
- 在很久之前修复某个bug拉的拷贝分支,在修完bug之后没有及时删除。
- 前几个窗口遗留下来的个人开发分支,在完成需求后也没有及时删除。
- 多人合作的共享分支,在完成需求后没有及时删除。
- 通过cherry-pick指令生成的临时分支,在解决完当时的问题后,没有及时删除
聚沙成塔,它们的数量已经达到了几十条。这对开发同学们在后续的开发窗口中进行新的目标分支部署和分支管理造成了效率上的影响(其实心情上也会受影响😔),因此期望同事们能够及时清理非活跃的开发分支。
分支积压的负面影响
- 我司使用
Jenkins
进行工程项目的构建与部署,在每个开发窗口部署对应版本的分支时,如果非活跃的分支数量过多,会导致选择当前版本的分支发布要选半天,一直滚动滚轮,往下滑,一不小心还会滚过头,很痛苦😣。
- 仓库大小增加。每个分支都是仓库历史的一个快照,随着时间的推移,非活跃分支会积累大量的历史提交,导致仓库整体大小增加。这可能会使得克隆和同步仓库的速度变慢。
造成分支积压的原因(为什么无法快速清理)
GitLab
在Branches
页面里只提供了按照分支名称筛选过滤的功能,虽然此功能支持模糊搜索,但是由于缺少规范约束,每个人的分支名称五花八门,你很难通过某些关键字去定位到具体某个人的分支,并且还有一堆cherry-pick
的分支,它们的名称都是诸如:cherry-pick-00xxa8cd
的格式,我们又怎么可能记得住和彻底区分😵。如果要找到自己的分支,得一个个分支点进去,查看分支详情,才看得到这个分支到底是谁创建的,但是现在有几十条分支,一个个点也太麻烦了。
那么,有没有什么办法可以快速定位我自己的开发分支,这样我删起来也快一点?
答案是,有的!
解决方案
使用GitLab
提供的REST API
。
https://[your_company's_repository_address]/api/v4/projects/[project_id]/repository/branches?per_page=[page_size]
# 举个🌰
https://code.xxxxxxxcompany.cn/api/v4/projects/105/repository/branches?per_page=1000
如何找到project_id
?
步骤
- 浏览器直接输入拼接好的链接:
https://code.xxxxxxxcompany.cn/api/v4/projects/105/repository/branches?per_page=1000
然后control
+A
,全选复制。
- 然后去JSON解析,获得数组数据(可以随便搜索一个在线JSON数据格式转换的网页)
数组里的成员大致是这么一个对象:
{
"name": "",
"commit": {
"id": "",
"short_id": "",
"created_at": "",
"parent_ids": [
"",
""
],
"title": "",
"message": "Merge branch ...",
"author_name": "",
"author_email": "",
"authored_date": "",
"committer_name": "",
"committer_email": "",
"committed_date": "",
"trailers": {
},
"web_url": "<>"
},
"merged": true,
"protected": false,
"developers_can_push": false,
"developers_can_merge": false,
"can_push": true,
"default": false,
"web_url": ""
}
- 点开网页的控制台,将复制好的数组数据做个
filter
和map
// author_email即为你的GitLab注册邮箱
[].filter(item=>item.commit.author_email==='xxx@xxx.com').map(item=>item.name)
然后拿这些名称在这个GitLab
的Branches
页面进行删除操作。
同事反馈
补充思考
既然都有了project_id
,为什么不能根据creator_id
去过滤,直接找到指定创建者的所有分支,从而实现一步到位呢?
答:因为GitLab的API不支持😫 文档链接