管道中合并请求目标分支和源分支之间的 Gitlab 差异

时间:2021-07-05 18:47:58

标签: git gitlab gitlab-ci

我的使用涉及在 Merge Request 和 Master 或 Release 分支(我想与之比较的分支)之间找到差异,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 无法识别合并请求目标分支差异并给出此输出。

fatal: ambiguous argument 'master...source': unknown revision or path not in the working tree.

我如何找到差异(即目录)。 感谢帮助!

1 个答案:

答案 0 :(得分:0)

这实际上不是 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 numbergit fetch --deepen numbergit fetch --unshallow 是改变现有浅层克隆深度或完全消除深度限制的三种方法。

如果您的 CI/CD 系统制作了一个浅层的单分支克隆,并且您需要一个具有更多远程跟踪名称的更深层次的克隆,您可以使用 git remote 和/或 git fetch 来实现。

由于我没有使用过 GitLab 的 CI 系统,我无法在这里提供配方,但基于 comments,听起来他们默认使用 --depth 50。如果您有深度旋钮,将其设置为零 (0) 是禁用 --depth 参数的常用方法,这也会禁用单分支。

请注意,无论系统如何克隆您的存储库,您通常只有一个 branch 名称,或者在通过标签克隆时甚至没有(分离的 HEAD)。完整克隆将具有一整套远程跟踪名称,而单分支克隆将只有一个远程跟踪名称,直到您使用 git remote 对其进行调整并运行后续git fetch 添加更多远程跟踪名称。

使用 GitHub Actions,默认情况下 v2 结帐会生成浅层单分支克隆,而 v1 结帐会生成完整克隆。


1现在有第三种方法,所谓的部分克隆promisor remotes。对于 CI 系统来说,这可以说是正确的方法,但是由于很多原因,部分克隆还不是很好,所以这可能需要等待实现的改进。