如何在GitLab快速清理自己的非活跃分支?

374 阅读3分钟

背景

我司使用GitLab来进行Git仓库的管理。但是随着多个开发窗口的迭代,在某个工程里遗留了很多没有及时清理的开发分支。

非活跃的分支,比如:

  • 在很久之前修复某个bug拉的拷贝分支,在修完bug之后没有及时删除。
  • 前几个窗口遗留下来的个人开发分支,在完成需求后也没有及时删除。
  • 多人合作的共享分支,在完成需求后没有及时删除。
  • 通过cherry-pick指令生成的临时分支,在解决完当时的问题后,没有及时删除

聚沙成塔,它们的数量已经达到了几十条。这对开发同学们在后续的开发窗口中进行新的目标分支部署和分支管理造成了效率上的影响(其实心情上也会受影响😔),因此期望同事们能够及时清理非活跃的开发分支。

分支积压的负面影响

  1. 我司使用Jenkins进行工程项目的构建与部署,在每个开发窗口部署对应版本的分支时,如果非活跃的分支数量过多,会导致选择当前版本的分支发布要选半天,一直滚动滚轮,往下滑,一不小心还会滚过头,很痛苦😣。

image.png

  1. 仓库大小增加。每个分支都是仓库历史的一个快照,随着时间的推移,非活跃分支会积累大量的历史提交,导致仓库整体大小增加。这可能会使得克隆和同步仓库的速度变慢

造成分支积压的原因(为什么无法快速清理)

GitLabBranches页面里提供了按照分支名称筛选过滤的功能,虽然此功能支持模糊搜索,但是由于缺少规范约束,每个人的分支名称五花八门,你很难通过某些关键字去定位到具体某个人的分支,并且还有一堆cherry-pick的分支,它们的名称都是诸如:cherry-pick-00xxa8cd的格式,我们又怎么可能记得住和彻底区分😵。如果要找到自己的分支,得一个个分支点进去,查看分支详情,才看得到这个分支到底是谁创建的,但是现在有几十条分支,一个个点也太麻烦了。

image.png

那么,有没有什么办法可以快速定位我自己的开发分支,这样我删起来也快一点?

答案是,有的

解决方案

使用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 ?

image.png

步骤

  1. 浏览器直接输入拼接好的链接:https://code.xxxxxxxcompany.cn/api/v4/projects/105/repository/branches?per_page=1000 然后control + A,全选复制。

image.png

  1. 然后去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"""  
    }
  1. 点开网页的控制台,将复制好的数组数据做个filtermap
// author_email即为你的GitLab注册邮箱
[].filter(item=>item.commit.author_email==='xxx@xxx.com').map(item=>item.name)

image.png

然后拿这些名称在这个GitLabBranches页面进行删除操作。

同事反馈

image.png

补充思考

既然都有了project_id,为什么不能根据creator_id去过滤,直接找到指定创建者的所有分支,从而实现一步到位呢?

答:因为GitLab的API不支持😫 文档链接

image.png