管道中的合并请求目标分支和源分支之间的GitLab差异 [英] Gitlab diff between Merge Request Target branch and Source Branch in pipeline
问题描述
我的用途包括查找合并请求和主分支或发布分支(我希望与之不同的任何分支)之间的差异,MR将设置CI_MERGE_REQUEST_TARGET_BRANCH
。
CHANGED_DIRS=$(git diff --name-only ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}...${CI_COMMIT_REF_NAME} | xargs -L1 dirname | uniq | cut -d'/' -f1 |tail -n+2 | uniq)
但是GitLab似乎无法识别合并请求目标分支diff,并提供此输出。
fatal: ambiguous argument 'master...source': unknown revision or path not in the working tree.
如何找到diff(即目录)。 感谢帮助!
推荐答案
这不是真正的Git问题,而是GitLab-CI问题。但是,这些特殊问题在多个CI/CD系统中突然出现,总是有相同的一般原因:
- 完全克隆大型存储库速度较慢。
- CI系统通常从克隆存储库开始。
- 因此,CI系统通常从创建存储库的不完整克隆开始。
- Git过去只提供了两种方法:1浅克隆和单分支克隆。事实上,它们往往是一起使用的:使用
git clone --depth number
创建浅层克隆也会创建单分支克隆,除非您也通过添加--no-single-branch
来强制覆盖Git的默认设置。
现在,任何给定CI/CD系统中的clone命令都可以控制,也可以在提供您作为开发人员可用的任何软件旋钮之前由CI/CD系统执行。如果您可以影响命令,通常可以这样做,但如果不能,您仍然可以通过运行其他Git命令来纠正该问题(这同样取决于CI/CD系统):
git remote set-branches --add
允许您向单个分支克隆添加各种分支;git fetch --depth number
、git fetch --deepen number
和git fetch --unshallow
是更改现有浅克隆的深度或完全取消深度限制的三种方式。
如果您的CI/CD系统创建了浅层的单分支克隆,并且您需要具有更多远程跟踪名称的更深的克隆,则可以使用git remote
和/或git fetch
来实现。
由于我没有使用过GitLab的CI系统,这里无法提供菜谱,但根据comments,听起来他们默认使用--depth 50
。如果您有一个深度旋钮,则将其设置为零(0
)是禁用--depth
参数的通常方式,这也会禁用单一分支性。
请注意,无论系统如何克隆您的存储库,您通常只有一个分支名称,或者在通过标记克隆时甚至没有(分离头)。完整克隆将具有完整的远程跟踪名称集,而单分支克隆将只有一个远程跟踪名称,直到您使用git remote
调整此名称并运行后续git fetch
以添加更多远程跟踪名称。
使用GitHub操作时,默认情况下,v2
签出创建浅层单分支克隆,而v1
签出创建完整克隆。
1现在还有第三种方法,即所谓的部分克隆WithPromisor Remote。这可以说是CI系统完成任务的正确方式,但是由于很多原因,部分克隆还不是很好,所以这可能需要等待实现的改进。
这篇关于管道中的合并请求目标分支和源分支之间的GitLab差异的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!