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

时间:2016-05-24 09:59:40

标签: gitlab git-merge

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

我说错了吗?我想用什么样的工具呢?

9 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:7)

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

披露:我开发了它。

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

您可以使用此方法创建合并请求。

它拥有的一些功能。

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

答案 2 :(得分:3)

截至目前,GitLab遗憾地不支持这一点,但我最近在issue tracker上看到了它。在接下来的几个月里,人们可以期待一种“原生工具”。

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

答案 3 :(得分:3)

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

答案 4 :(得分:2)

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

$test = Test::where('level', 'medium')->where('lesson_id', $lesson->id)->exists();

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

答案 5 :(得分:1)

在我们的构建脚本中,我们只是使用正确的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"

答案 6 :(得分:0)

我使用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,则回显新MR的json结果(同样保存为mr.json文件)。

答案 7 :(得分:0)

您可以编写一个本地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 linuxfancier 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

答案 8 :(得分:0)

我做了一个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

通过在GitLab MR网页的源中搜索merge_request[,可以轻松找到可能的查询字符串参数。