How to create a GitLab merge request via command line

GitlabGit Merge

Gitlab Problem Overview


We are working on integrating GitLab (enterprise edition) in our tooling, but one thing that is still on our wishlist is to create a merge request in GitLab via a command line (or batchfile or similar, for that matter). We would like to integrate this in our tooling. Searching here and on the web lead me to believe that this is not possible with native GitLab, but that we need additional tooling for that.

Am I correct? And what kind of tooling would I want to use for this?

Gitlab Solutions


Solution 1 - Gitlab

As of GitLab 11.10, if you're using git 2.10 or newer, you can automatically create a merge request from the command line like this:

git push -o merge_request.create

More information can be found in the docs.

Solution 2 - Gitlab

It's not natively supported, but it's not hard to throw together. The gitlab API has support for opening MR: https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/merge_requests.md#create-mr

Solution 3 - Gitlab

You can use following utility.

Disclosure : I developed it.

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

You can create merge request using this.

Some of the features it has are.

  1. Base branch is optional. If base branch is not provided. Current branch is used as base branch.
  2. target branch is optional. If target branch is not provided, default branch of the repo in gitlab will be used.
  3. Created pull request page will be opened automatically after successful creation.
  4. If title is not supported with -m option value. It will be taken from in place editor opened. First line is taken as title.
  5. In the editor opened third line onwards takes as description.
  6. Comma separated list of labels can be provided with its option.
  7. Supports CI.
  8. Repository specific configs can be given.
  9. squash option is available.
  10. remove source branch option is available.

Solution 4 - Gitlab

If you push your branch before this command (git push -o merge_request.create) it will not work. Git will response with Everything up-to-date and merge request will not be created (gitlab 12.3).

When I tried to remove my branch from a server (do not remove your local branch!!!) then it worked for me in this form.

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

Solution 5 - Gitlab

In addition to answering of @AhmadSherif, You can use merge_request.target=<branch_name> for declaring the target branch.

sample usage:

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

Simple This:

According to the Gitlab documents, you can define an alias for this command to simpler usage.

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

Solution 6 - Gitlab

As of now, GitLab sadly does not support this, however I recently saw it on their issue tracker. It appears one can expect a 'native tool' in the upcoming months.

GitLab tweeted out about numa08/git-gitlab some time ago, so I guess this would be worth a try.

Solution 7 - Gitlab

I made a shell function which opens up the GitLab MR web interface with desired parameters.

Based on the directory with the git repo you are currently in, it:

  • Finds the correct URL to your repo.
  • Sets the source branch to the branch you're currently on.

As a optional first argument you can provide the target branch. Otherwise, GitLab defaults to your default branch, which is typically 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"

}

You can set more default values in the URL, like removing the source branch after merge:

&merge_request[force_remove_source_branch]=true

Or assignee to someone:

&merge_request[assignee_ids][]=12345

Or add a reviewer:

&merge_request[reviewer_ids][]=54321

You can easily find the possible query string parameters by searching the source of the GitLab MR webpage for merge_request[.

Solution 8 - Gitlab

In our build script we just pop up the browser with the correct URL and let the developer write his comments in the form hit save to create the merge request. You get this url with the correct parameters by creating a merge request manually and copying the url of the form.

#!/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"

Solution 9 - Gitlab

You can write a local git alias to open a Gitlab Merge Request creation page in the default browser for the currently checked-out branch.

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

(this is a very simple alias for windows; I guess there are equivalent replacements for "start" on linux and fancier aliases that work with github and bitbucket too)

As well as being able to immediately see&modify the details of the MR, the advantage of this over using the merge_request.create push option is that you don't need your local branch to be behind the remote for it to work.

You might additionally want to store the alias in the repo itself.

Solution 10 - Gitlab

I use https://github.com/mdsb100/cli-gitlab

I am creating the MR from inside of a gitlab CI docker container based on alpine linux, so I include the install command in before-script (that could also be included in your image). All commands in the following .gitlab-ci.yml file, are also relevant for normal command line usage (as long as you have the cli-gitlab npm installed).

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

This will echo true if the merge request already exists, and echo the json result of the new MR if it succeeds to create one (also saving to a mr.json file).

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionpatrickView Question on Stackoverflow
Solution 1 - GitlabAhmad SherifView Answer on Stackoverflow
Solution 2 - GitlabjaxxstormView Answer on Stackoverflow
Solution 3 - GitlabVishwanathView Answer on Stackoverflow
Solution 4 - GitlabmilcziView Answer on Stackoverflow
Solution 5 - GitlabSamiAzarView Answer on Stackoverflow
Solution 6 - Gitlabuser6365161View Answer on Stackoverflow
Solution 7 - GitlabgitaarikView Answer on Stackoverflow
Solution 8 - GitlabDavid DehghanView Answer on Stackoverflow
Solution 9 - GitlabhoweajView Answer on Stackoverflow
Solution 10 - GitlabgotjoshView Answer on Stackoverflow