极狐 GitLab 冷知识:使用 git push 创建 Merge Request

前言

在使用 GitLab 时,创建 Merge Request 是最常用的功能之一,每天有大量的 Merge Request 被 Create、Review、Approve 和 Merge,尽管 GitLab 的产品经理和 UX 设计师们已经尽力的将 UI 设计的简洁易懂好操作,并提供了一些诸如使用 Email、API、Web IDE、VS Code 插件等创建 Merge Request 的功能,但这些操作都逃不过:create new branch ==> git push ==> create merge request 这三步。

那么有没有方法可以将这三步合并成一步呢?答案是有的,git push options 可以直接通过 git push 来创建 GitLab Merge Request。

Tips:在您向 GitLab 推送新分支完成后,GitLab 会在您的终端用链接提示您创建合并请求,效果如下:... remote: To create a merge request for my-new-branch, visit: remote: https://gitlab.example.com/my-group/my-project/merge_requests/new?merge_request[source_branch]=my-new-branch ⌘+点击该链接 即可直接跳转 Merge Request 创建页面。

版本要求

GitLab 自 11.7 版本开始支持 git push options,目前(GitLab 15.0)支持的 push options 有 CI/CD 操作Merge Request 操作 两种。

Git push options 仅适用于 Git 2.10 或更新版本。

对于 Git 版本 2.10 到 2.17,使用 --push-option:

复制代码
git push --push-option=<push_option>

对于 2.18 及更高版本,您可以使用上述格式,或者更短的 -o:

复制代码
git push -o <push_option>

创建 Merge Request

现在您就可以使用一行 git push 命令来完成推送代码+创建 Merge Request 的操作了:

复制代码
git push -o merge_request.create -o merge_request.target=my-target-branch

复制代码

Tips: 通过使用多个 -o(或 --push-option)标志,您可以组合推送选项以一次完成多个任务。

可用选项

GitLab 提供了多种操作项来帮您完成 Merge Request 的创建。当然,您也可以通过 merge_request.description + Quick action 的方式完成更多的操作。

如果您使用要求文本中包含空格的推送选项,则需要将其括在引号 (") 中。如果没有空格,您可以省略引号。一些示例:

复制代码
git push -o merge_request.label="Label with spaces"git push -o merge_request.label=Label-with-no-spaces

复制代码

在 GitLab CI 中创建 Merge Request

目前网上对于在 GitLab CI 中创建 Merge Request 的方法,全是使用 curl 调用 GitLab API 来实现的。其实不必那么麻烦,git push options 一个操作即可解决。

复制代码
Create Merge Request:  stage: push  image: alpine:latest  before_script:    - sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories    - apk add --update git    - git config --global user.name "${GITLAB_USER_NAME}"    - git config --global user.email "${GITLAB_USER_EMAIL}"  script: |        echo "create merge request"    git checkout -b auto-${CI_JOB_ID}    git add .    git commit -m "auto create merge request"    git push "https://${GITLAB_USER_LOGIN}:${CI_GIT_TOKEN}@${CI_REPOSITORY_URL#*@}" "HEAD:auto-${CI_JOB_ID}" \     -o merge_request.create -o merge_request.target=develop -o merge_request.remove_source_branch \     -o merge_request.title="auto generator swagger api" -o merge_request.label="auto-generation" -o merge_request.assign="qk44077907"

这里的 CI_GIT_TOKEN 需要先创建[用户访问令牌](https://xie.infoq.cn/link?target=https%3A%2F%2Fdocs.gitlab.cn%2Fjh%2Fuser%2Fproject%2Fsettings%2Fproject_access_tokens.html "用户访问令牌"),并将其添加到 [CI/CD Variables](https://xie.infoq.cn/link?target=https%3A%2F%2Fdocs.gitlab.cn%2Fjh%2Fci%2Fvariables "CI/CD Variables") 当中。如果使用的是项目访问令牌,则需要将 {GITLAB_USER_NAME} 和 ${GITLAB_USER_EMAIL} 配置为项目机器人用户:

  • Name:project_{project_id}_bot

  • Email:project{project_id}_bot@noreply.{Gitlab.config.gitlab.host}

更多内容见官方文档

CI/CD Push options

目前支持的 CI/CD push options 有两个:跳过 CI Jobs插入 CI/CD Variable ,比较常用的是 插入 CI/CD Variable,可以用来测试一些 Variable 的效果。

使用 ci.skip 的示例:

复制代码
git push -o ci.skip

为流水线传递一些 CI/CD 变量的示例:

复制代码
git push -o ci.variable="MAX_RETRIES=10" -o ci.variable="MAX_TIME=600"

使用 git alias 简化命令

一般来说使用 git push options 的场景都比较固定,可以考虑将很长的 push options 设置为 Git aliases 来简化命令。

设置 Git alias:

复制代码
git config --global alias.mwps "push -o merge_request.create -o merge_request.target=master -o merge_request.merge_when_pipeline_succeeds"

然后快速推送以默认分支为目标的本地分支,并在流水线成功时合并:

复制代码
git mwps origin <local-branch-name>

结语

极狐 GitLab 文档中心

现已正式上线,本文的大部分内容来自使用 Git --> 推送选项部分。在开始动手工作之前仔细阅读一下文档是一个非常好的习惯,可以帮助您少走很多弯路。

参考资料

相关推荐
懵逼的小黑子6 分钟前
git与远程仓库创建连接
git
前端若水43 分钟前
Git 撤销与恢复完全指南(超级详细版)
大数据·git·elasticsearch
tonydf1 小时前
日志模块该如何设计
后端·elasticsearch
golang学习记1 小时前
Git 2.54 来了,这个新命令让我终于敢重写历史了
git·后端
其实防守也摸鱼1 小时前
AWVS下载和安装保姆级教程
linux·服务器·git
前端若水1 小时前
Git 可以做的所有操作(完整分类)
大数据·git·elasticsearch
Elasticsearch1 小时前
我们如何构建 Elasticsearch simdvec,使向量搜索成为世界上最快之一
elasticsearch
叹一曲当时只道是寻常1 小时前
Reference 工具安装与使用教程:一条命令管理 Git 仓库引用与知识沉淀
人工智能·git·ai·开源·github
搬砖天才、2 小时前
es数据备份
大数据·elasticsearch·jenkins
aXin_ya2 小时前
微服务第六天 es继续了解
大数据·elasticsearch·搜索引擎