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

Posted

技术标签:

【中文标题】如何通过命令行创建 GitLab 合并请求【英文标题】:How to create a GitLab merge request via command line 【发布时间】:2016-09-21 11:19:04 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

我创建了一个 shell 函数,它可以打开带有所需参数的 GitLab MR Web 界面。

根据您当前所在的 git repo 所在的目录,它:

为您的存储库找到正确的 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 $1 ]]; then
        target_branch="&merge_request[target_branch]=$1"
    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[ 轻松找到可能的查询字符串参数。

【讨论】:

【参考方案2】:

您可以编写本地 git 别名,以在当前签出分支的默认浏览器中打开 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和fancier aliases that work with github and bitbucket too)

除了能够立即查看和修改 MR 的详细信息之外,与使用 merge_request.create 推送选项相比,它的优势在于您不需要 need your local branch to be behind the remote for it to work。

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

【讨论】:

【参考方案3】:

除了回答@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"

【讨论】:

【参考方案4】:

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

git push -o merge_request.create

更多信息可以在docs找到。

【讨论】:

您能否在您的答案中添加一些关于如何指定目标分支和删除源分支选项的扩展? Gitlab 已移动 documentation for git push options。您还可以在merge request that added this feature to Gitlab 中查看原始文档。 如何指定目标分支? 您可以使用git push -o merge_request.create -o merge_request.target=develop 指定目标分支,也可以使用附加-o merge_request.remove_source_branch 删除源分支 另请注意,如果您想在不提交的情况下推送,则此命令不起作用【参考方案5】:

如果您在此命令 (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

【讨论】:

您可以简单地添加一个空提交,然后再次推送。【参考方案6】:

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

披露:我开发了它。

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

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

它具有的一些功能是。

    基本分支是可选的。如果未提供基本分支。当前分支用作基础分支。 目标分支是可选的。如果没有提供目标分支,将使用gitlab中repo的默认分支。 创建成功后会自动打开创建的拉取请求页面。 如果 -m 选项值不支持标题。它将取自打开的编辑器。第一行作为标题。 在编辑器中打开第三行起作为描述。 可以通过其选项提供逗号分隔的标签列表。 支持 CI。 可以提供特定于存储库的配置。 壁球选项可用。 删除源分支选项可用。

【讨论】:

通过git branch -u origin/<branch-name>设置上游分支来解决这个问题。 我在尝试创建合并请求时也遇到了问题:github.com/vishwanatharondekar/gitlab-cli/issues/92【参考方案7】:

在我们的构建脚本中,我们只需使用正确的 URL 弹出浏览器,然后让开发人员以点击保存的形式编写他的 cmets 以创建合并请求。您可以通过手动创建合并请求并复制表单的 url 来获得具有正确参数的 url。

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

BRANCH=$2

....

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"

【讨论】:

【参考方案8】:

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

我正在基于 alpine linux 的 gitlab CI docker 容器内部创建 MR,因此我在 before-script 中包含 install 命令(也可以包含在您的图像中)。以下 .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 的 json 结果(也保存到 mr.json 文件)。

【讨论】:

【参考方案9】:

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

【讨论】:

谢谢,这让我走上了正轨。我想。我以前看过 API,但找不到访问它的方法。你的链接让我走上了正轨,我找到了一个问题的链接,有人想从命令行创建一个新项目link 如果您正在查看此答案。查看下面的答案,了解我为此创建的实用程序。 现在通过 git push 选项原生支持:docs.gitlab.com/ce/user/project/merge_requests/… @BradK。 Gitlab 已经移动了documentation for git push options。您还可以在merge request that added this feature to Gitlab 中查看原始文档。【参考方案10】:

到目前为止,GitLab 很遗憾不支持此功能,但我最近在他们的 issue tracker 上看到了它。在接下来的几个月里,人们似乎可以期待一个“原生工具”。

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

【讨论】:

以上是关于如何通过命令行创建 GitLab 合并请求的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 Gitlab 在分支合并上创建额外的合并提交

使用 Gitlab API 命令合并合并请求

Gitlab命令行简单使用

Mercurial 无法通过命令行合并

如何从命令行创建TFS拉取请求

git 从命令行 git pull 请求代码审查