【发布时间】:2016-09-21 11:19:04
【问题描述】:
我们正在努力将 GitLab(企业版)集成到我们的工具中,但我们的愿望清单上仍有一件事是通过命令行(或批处理文件或类似文件)在 GitLab 中创建合并请求。我们希望将其集成到我们的工具中。在这里和网上搜索让我相信这对于本地 GitLab 是不可能的,但我们需要额外的工具来实现这一点。
我说的对吗?我想为此使用哪种工具?
【问题讨论】:
我们正在努力将 GitLab(企业版)集成到我们的工具中,但我们的愿望清单上仍有一件事是通过命令行(或批处理文件或类似文件)在 GitLab 中创建合并请求。我们希望将其集成到我们的工具中。在这里和网上搜索让我相信这对于本地 GitLab 是不可能的,但我们需要额外的工具来实现这一点。
我说的对吗?我想为此使用哪种工具?
【问题讨论】:
我创建了一个 shell 函数,它可以打开带有所需参数的 GitLab MR Web 界面。
根据您当前所在的 git repo 所在的目录,它:
作为可选的第一个参数,您可以提供目标分支。否则,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[ 轻松找到可能的查询字符串参数。
【讨论】:
您可以编写本地 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。
【讨论】:
除了回答@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"
【讨论】:
从 GitLab 11.10 开始,如果您使用的是 git 2.10 或更新版本,您可以像这样从命令行自动创建合并请求:
git push -o merge_request.create
更多信息可以在docs找到。
【讨论】:
git push -o merge_request.create -o merge_request.target=develop 指定目标分支,也可以使用附加-o merge_request.remove_source_branch 删除源分支
如果您在此命令 (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
【讨论】:
您可以使用以下实用程序。
披露:我开发了它。
https://github.com/vishwanatharondekar/gitlab-cli
您可以使用它创建合并请求。
它具有的一些功能是。
【讨论】:
git branch -u origin/<branch-name>设置上游分支来解决这个问题。
在我们的构建脚本中,我们只需使用正确的 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"
【讨论】:
我用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 文件)。
【讨论】:
本机不支持它,但组合起来并不难。 gitlab API已经支持开启MR:https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/merge_requests.md#create-mr
【讨论】:
到目前为止,GitLab 很遗憾不支持此功能,但我最近在他们的 issue tracker 上看到了它。在接下来的几个月里,人们似乎可以期待一个“原生工具”。
GitLab 不久前发布了关于 numa08/git-gitlab 的推文,所以我想这值得一试。
【讨论】: