为什么 git diff 返回“坏对象”?

Ste*_*fan 6 git continuous-integration gitlab

我正在我的 Gitlab 服务器上运行 ci 任务。其中一项操作是在构建运行器计算机上调用执行一些更新的 exe。

$CI_COMMIT_BEFORE_SHA我从和传递 SHA1,$CI_COMMIT_SHA代码调用:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA
Run Code Online (Sandbox Code Playgroud)

通常它会给我一个在提交中已更改的文件名列表,但有时我会收到错误:

fatal: bad object abcd1234
                  ^
                  |-- This is the $CI_COMMIT_SHA
Run Code Online (Sandbox Code Playgroud)

存储库刚刚下载到构建运行器,因此它是最新的,为什么 git diff 会在这里返回一个错误的对象?

Gab*_*ers 5

如果提交是“旧的”,则克隆中可能会丢失它,因为 Gitlab默认使用深度为 20 的浅克隆

这就是您在作业日志中看到此消息的原因:

正在获取 git 深度设置为 20 的更改...

可能的解决方案:

  • 使用Web 界面为您的项目增加此值(或禁用浅克隆)。
  • 覆盖变量GIT_DEPTH来自.gitlab-ci.yml
  • .gitlab-ci.yml使用脚本中的标准克隆手动重新克隆存储库
  • 停止依赖“旧”哈希值


小智 1

git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME git diff-tree --no-commit-id --name-only -r $CI_COMMIT_BEFORE_SHA -r $CI_COMMIT_SHA

它帮助了我!