Git别名问题:无法从当前分支向多目标分支创建多个Merge Request
问题原因
第一次执行git mr-master时,本地分支会被推送到origin仓库,后续执行git mr-release和git mr-develop的git push命令时,因为本地分支和远程分支内容完全一致,Git会返回Everything up-to-date,不会触发GitLab处理-o merge_request.*这类推送选项——这类选项只有在实际发生推送动作(分支有新内容需要同步)时才会被GitLab解析执行。
解决方案
用git push的方式没法实现同一分支无更新时多次创建MR的需求,推荐改用GitLab API来直接创建Merge Request,不管分支是否已经推送,都能生成目标分支的MR。
方法一:用GitLab API创建MR
首先需要获取GitLab个人访问令牌(需开启api权限),可以把令牌设为环境变量GITLAB_TOKEN,避免明文写在配置里。然后修改Git别名配置如下:
[alias] mr-master = "!curl --request POST --header \"PRIVATE-TOKEN: $GITLAB_TOKEN\" \"https://你的GitLab实例地址/api/v4/projects/$(git config --get remote.origin.url | sed -E 's/.*\/([^\/]+)\/([^\/.]+)(\.git)?$/\1%2F\2/')/merge_requests\" --form \"source_branch=$(git rev-parse --abbrev-ref HEAD)\" --form \"target_branch=master\" --form \"remove_source_branch=false\" --form \"title=Hotfix: $(git rev-parse --abbrev-ref HEAD)\"" mr-release = "!curl --request POST --header \"PRIVATE-TOKEN: $GITLAB_TOKEN\" \"https://你的GitLab实例地址/api/v4/projects/$(git config --get remote.origin.url | sed -E 's/.*\/([^\/]+)\/([^\/.]+)(\.git)?$/\1%2F\2/')/merge_requests\" --form \"source_branch=$(git rev-parse --abbrev-ref HEAD)\" --form \"target_branch=release\" --form \"remove_source_branch=false\" --form \"title=Hotfix: $(git rev-parse --abbrev-ref HEAD)\"" mr-develop = "!curl --request POST --header \"PRIVATE-TOKEN: $GITLAB_TOKEN\" \"https://你的GitLab实例地址/api/v4/projects/$(git config --get remote.origin.url | sed -E 's/.*\/([^\/]+)\/([^\/.]+)(\.git)?$/\1%2F\2/')/merge_requests\" --form \"source_branch=$(git rev-parse --abbrev-ref HEAD)\" --form \"target_branch=develop\" --form \"remove_source_branch=true\" --form \"title=Hotfix: $(git rev-parse --abbrev-ref HEAD)\"" hotfix = !git mr-master && git mr-release && git mr-develop
注意事项:
- 替换
https://你的GitLab实例地址为实际的GitLab域名或IP - Windows环境下需要确保
sed命令可用(可以通过Git Bash、WSL或者安装GNU工具集来支持) - 个人访问令牌建议通过系统环境变量设置,不要直接写在配置文件里
方法二:添加空提交触发推送(不推荐)
如果一定要用git push的方式,可以在每次推送前添加一个空提交,强制触发推送动作,但这会污染提交历史,不适合正式环境:
[alias] mr-master = "!git push -o merge_request.create -o merge_request.target=master origin HEAD" mr-release = "!git commit --allow-empty -m \"触发release分支MR\" && git push -o merge_request.create -o merge_request.target=release origin HEAD" mr-develop = "!git commit --allow-empty -m \"触发develop分支MR\" && git push -o merge_request.create -o merge_request.target=develop -o merge_request.remove_source_branch origin HEAD" hotfix = !git mr-master && git mr-release && git mr-develop
内容的提问来源于stack exchange,提问作者MmynameStackflow
相关产品推荐
相关产品推荐

