我有两个分支,master 和turtles,其中turtles 领先于master 一项提交:“我喜欢turtles”。
在 GitLab 中,我有以下 .yml 文件,每当创建 merge 请求或通过推送分支进行 merge 来更新该请求时,该文件都会运行:
update-doc:
stage: deploy
script:
- echo $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
- 'echo $(git log --abbrev-commit remotes/origin/master)'
- 'echo $(git log --abbrev-commit remotes/origin/master..remotes/origin/${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME})'
- 'echo $(git cherry -v remotes/origin/master remotes/origin/turtles --abbrev=1)'
only:
- merge_requests
运行git log --abbrev-commit remotes/origin/master..remotes/origin/turtles
或gitcherry -v remotes/origin/master remotes/origin/turtles
code> 在我的 Windows 机器上的 Git Bash 和我们托管 GitLab 的 Linux VM 上,返回提交消息“我喜欢海龟”,正如预期的那样。但是当 .yml
文件运行时,它找不到分支 remotes/origin/turtles
并且我得到以下输出:
$ echo $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
turtles
$ echo $(git log --abbrev-commit remotes/origin/master)
8406e4d Update .gitlab-ci.yml
$ echo $(git log --abbrev-commit remotes/origin/master..remotes/origin/${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME})
fatal: ambiguous argument 'remotes/origin/master..remotes/origin/turtles': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git [...] -- [...]'
$ echo $(git cherry -v remotes/origin/master remotes/origin/turtles --abbrev=1)
fatal: Unknown commit remotes/origin/turtles
因此,GitLab 清楚地知道存在turtles 分支,因为它位于 $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
变量中,但似乎无法解析remotes/origin/turtles。我也尝试过不使用 Remote /原点/部分,但仍然没有运气。
如何让 GitLab 运行程序识别 merge 请求分支的远程路径?或者我可以尝试另一个 git 命令来仅显示海龟分支上的提交?
最佳答案
在 GitLab CI/CD 中, checkout 代码的默认策略是通过浅 merge 获取当前分支,例如git fetch --深度 50 来源 $CI_COMMIT_BRANCH 。这解释了为什么您只看到一个分支。
您可以解决此问题:
- 通过在 Web UI 中将“Git 浅克隆”设置为 0,或者
- 通过在
.gitlab-ci.yml
中设置GIT_DEPTH: 0
来禁用浅克隆,或者 - 通过 pull/获取您需要的任何其他分支,例如
git fetch origin master
关于Git 仅在 GitLab 中记录不明确的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60298600/