操作 Gitlab MR 的命令行工具
操作 Gitlab MR 的命令行工具
背景
为什么开发这个工具?主要解决以下问题:
- 提测、上 UAT 时,避免漏合代码。
- 代码冲突时,团队成员不用再问“解决这个冲突要怎么切分支?”
- 一个 feature 分支要向多个保护分支提交合并请求时,减少烦琐而易错的选取分支的界面操作。
可能会有人问:为什么会漏合代码?当你在某一个迭代需要来回在不同的 feature 分支切换、一个 feature 横跨多个项目,同时你偶尔还要兼顾 bug 修复的时候,你极容易丢失上下文。
并且,不同的 feature 研发进度不一致,可能出现的一种情况是:feature A 只是合并到 test 分支,但 feature B 却已经合并到了 uat。
对此,有人问你代码到底合并了没,你怎么确认?一个个项目去相应的主干分支里查看提交历史吗?就是因为不想再这样做了,这才有了这个工具。
安装
解压zip
下载并解压文件:
安装git bash
Windows系统才要安装。
如果 git bash 版本不足 2.41.0,最好安装最新版本。
安装地址:https://gitforwindows.org/
配置
新增文件
vi ~/.mr-config.json
复制以下内容:
{
"gitlab_url":"https://your-gitlab.com",
"gitlab_token":"your-token",
"codebases": {
"default": ["dev", "test", "master"]
}
}
对于该配置的解释,详见后文。
gitlab_token
先获取 gitlab token,操作如下:
- 打开Gitlab,右上角点击个人头像
- 点击左侧边栏
- 勾选全部权限,并确认生成 token
codebases
适用于多基线的场景。
如产品默认有三个环境,分别对应三条分支 dev、test、master。
同时,又有定制化需求,专门为某一客户进行源码改动,同样有三个环境,则可能出现的配置如下:
"codebases": {
"default": ["dev", "test", "master"],
"customize": ["customize-dev", "customize-test", "customize-master"]
}
环境变量
把 mr 可执行文件所在目录设置到环境变量中:
- 查找"环境变量"
- 点击"环境变量"
- 找到 Path,点击"编辑"
- 点击"新增",再点击"浏览",找到最里层的 mr 目录
(上图是示例,具体路径根据自己的情况而定)
重新打开 git bash 即可生效,记得一定要重新打开!
注:如果是 Linux,那很简单,修改 ~/.bashrc
export PATH=$PATH:mr文件夹所在路径即可
IDEA
该步骤选填,适用于 JetBrains 系列产品,想在 IDEA 的终端中也使用 mr 命令时可配置。
File -> Settings -> Tools -> Terminal:
使用
可以不带参数运行,查看支持的命令:mr
创建MR
# 默认以当前分支作为 source_branch
# 根据 codebases 的设置选择 target_branch
mr create
提示输入要提交 MR 的源分支,按回车使用当前分支:
创建成功:
可以处理同名项目的情况:
MR 不会重复创建:
分支没有代码更新时,也不会创建 MR:
查看MR
mr list
可以用来查看自己有哪些MR未合并。注意:只显示自己创建的。
- 如果可以合并,显示 [ok]
- 如果有冲突,显示 [conflict]
合并MR
# 格式如下
# mr merge {mr_url}
mr merge https://gitlab.com/my-project/-/merge_requests/2
{mr_url} 的值可以根据以下方式来获取:
- create 命令成功后的输出
- list 命令的输出
- gitlab web界面上 MR 的 url
合并前会有确认提示:
可以取消,防止误合并:
冲突处理
解决冲突,切换分支,是很麻烦的事情,故本工具为解决冲突提供了一些辅助功能。
注意:命令行只做拉取代码、切合分支等必要操作,冲突的解决仍需要人工介入,工具不会自动合并代码的。
合并冲突状态的MR:
mr merge {conflict_mr_url}
出现提示,是否自动切换分支为解决冲突作准备:
当然在此之前,要保证工作目录是干净的,如果有修改未提交,会中止切换分支操作:
可以使用
git stash
保存修改,合并冲突后,再git stash pop
命令执行成功时,会切换到 conflict/
开头的分支。
此时,打开 IDE 或 Git 管理工具,根据提示把相应的分支合并到 conflict/
分支即可。
以 IDEA 为例:
解决冲突后,再切回命令行,此时有两种选择:
- 创建 MR,适用于自己没有权限合并的场景
- 合并 MR,适用于自己有权限合并的场景
如果是创建,再次执行 create 命令即可:
mr create
创建的 MR 合并时会自动删除 conflict/
分支。
如果是合并,同样再次执行 merge 命令即可,此时不用带参数:
mr merge