如何通过命令行创建 GitLab 合并请求

How to create a GitLab merge request via command line

我们正在努力将 GitLab(企业版)集成到我们的工具中,但仍然在我们愿望清单上的一件事是通过命令行(或批处理文件或类似文件)在 GitLab 中创建合并请求.我们希望将其集成到我们的工具中。在这里和网络上的搜索让我相信这对于原生 GitLab 是不可能的,但我们需要额外的工具来实现。

我说的对吗?我想为此使用哪种工具?

截至目前,GitLab 遗憾地不支持这一点,但我最近在他们的 issue tracker 上看到了它。看来人们可以期待在接下来的几个月里 'native tool'。

GitLab 前段时间发布了关于 numa08/git-gitlab 的推文,所以我想这值得一试。

它本身不支持,但拼凑起来并不难。 gitlab API 已经支持打开MR: https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/merge_requests.md#create-mr

您可以使用以下实用程序。

披露:我开发了它。

https://github.com/vishwanatharondekar/gitlab-cli

您可以使用它创建合并请求。

它的一些功能是。

  1. 基本分支是可选的。如果未提供基本分支。当前分支用作基本分支。
  2. 目标分支是可选的。如果没有提供目标分支,将使用 gitlab 中 repo 的默认分支。
  3. 已创建的拉取请求页面将在创建成功后自动打开。
  4. 如果 -m 选项值不支持标题。它将从原地编辑器中打开。第一行作为标题。
  5. 在编辑器中打开第三行以上作为描述。
  6. 逗号分隔的标签列表可以与其选项一起提供。
  7. 支持CI。
  8. 可以提供特定于存储库的配置。
  9. 压缩选项可用。
  10. 删除源分支选项可用。

我用https://github.com/mdsb100/cli-gitlab

我正在基于 alpine linux 从 gitlab CI docker 容器内部创建 MR,所以我在 before-script 中包含安装命令(也可以是包含在您的图像中)。以下 .gitlab-ci.yml 文件中的所有命令也与正常命令行使用相关(只要您安装了 cli-gitlab npm)。

variables:
    TARGET_BRANCH: 'live'
    GITLAB_URL: 'https://your.gitlab.net'
    GITLAB_TOKEN: $PRIVATE_TOKEN #created in user profile & added in project settings
before-script:
    -apk update && apk add nodejs && npm install cli-gitlab -g
script:
    - gitlab url $GITLAB_URL && gitlab token $GITLAB_TOKEN
    - 'echo "gitlab addMergeRequest $CI_PROJECT_ID $CI_COMMIT_REF_NAME \"$TARGET_BRANCH\" 13 `date +%Y%m%d%H%M%S`"'
    - 'gitlab addMergeRequest $CI_PROJECT_ID $CI_COMMIT_REF_NAME "$TARGET_BRANCH" 13 `date +%Y%m%d%H%M%S` 2> ./mr.json'
    - cat ./mr.json

如果合并请求已经存在,这将回显 true,如果新 MR 成功创建(也保存到 mr.json 文件),则回显新 MR 的 json 结果。

在我们的构建脚本中,我们只是用正确的 URL 弹出浏览器,让开发人员在表单中写下他的评论,点击保存以创建合并请求。通过手动创建合并请求并复制表单的 url,您可以使用正确的参数获得此 url。

#!/bin/bash
set -e
set -o pipefail

BRANCH=

....

git push -f origin-gitlab $BRANCH
open "https://gitlab.com/**username**/**project-name**/merge_requests/new?merge_request%5Bsource_branch%5D=$BRANCH&merge_request%5Bsource_project_id%5D=99999&merge_request%5Btarget_branch%5D=master&merge_request%5Btarget_project_id%5D=99999"

从 GitLab 11.10 开始,如果您使用的是 git 2.10 或更新版本,您可以像这样从命令行自动创建合并请求:

git push -o merge_request.create

可以在 docs 中找到更多信息。

如果您在此命令 (git push -o merge_request.create) 之前推送您的分支,它将不起作用。 Git 将以 Everything up-to-date 响应并且不会创建合并请求(gitlab 12.3)。

当我试图从服务器上删除我的分支时(不要删除你的本地分支!!!)然后它以这种形式对我有用。

git push --set-upstream origin your-branch-name -o merge_request.create

除了回复@AhmadSherif,你还可以使用merge_request.target=<branch_name>声明目标分支。

示例用法:

git push -o merge_request.create -o merge_request.target=develop origin feature

简单这样:

根据Gitlab文档,您可以为该命令定义一个别名,使用起来更简单。

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

您可以编写本地 git 别名,以在默认浏览器中为当前 checked-out 分支打开 Gitlab 合并请求创建页面。

[alias]
    lab = "!start https://gitlab.com/path/to/repo/-/merge_requests/new?merge_request%5Bsource_branch%5D=\"$(git rev-parse --abbrev-ref HEAD)\""

(这是windows的一个非常简单的别名;我猜还有equivalent replacements for "start" on linux and fancier aliases that work with github and bitbucket too

除了能够立即查看和修改 MR 的详细信息外,与使用 merge_request.create 推送选项相比,这样做的优势在于您不需要

您可能还想 store the alias in the repo itself

我做了一个 shell 函数,它打开了带有所需参数的 GitLab MR 网络界面。

根据您当前所在的 git 存储库目录,它:

  • 为您的存储库找到正确的 URL。
  • 将源分支设置为您当前所在的分支。

作为可选的第一个参数,您可以提供目标分支。否则,GitLab 默认为您的默认分支,通常是 master.

gmr() {
    # A quick way to open a GitLab merge request URL for the current git branch
    # you're on. The optional first argument is the target branch.

    repo_path=$(git remote get-url origin --push | sed 's/^.*://g' | sed 's/.git$//g')
    current_branch=$(git rev-parse --abbrev-ref HEAD)

    if [[ -n  ]]; then
        target_branch="&merge_request[target_branch]="
    else
        target_branch=""
    fi

    xdg-open "https://gitlab.com/$repo_path/merge_requests/new?merge_request[source_branch]=$current_branch$target_branch"

}

您可以在 URL 中设置更多默认值,例如合并后删除源分支:

&merge_request[force_remove_source_branch]=true

或某人的受让人:

&merge_request[assignee_ids][]=12345

或添加审稿人:

&merge_request[reviewer_ids][]=54321

您可以通过在 GitLab MR 网页的来源中搜索 merge_request[.

轻松找到可能的查询字符串参数