为什么 git diff 返回"坏对象"?



我正在Gitlab服务器上运行一个ci任务。其中一个操作是在执行某些更新的生成运行程序计算机上调用exe。

我通过来自$CI_COMMIT_BEFORE_SHA$CI_COMMIT_SHA的SHA1,代码调用:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA

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

fatal: bad object abcd1234
^
|-- This is the $CI_COMMIT_SHA

repo刚刚下载到构建运行程序,所以它是最新的,为什么git diff会在这里返回一个坏对象?

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

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

获取git深度设置为20的更改…

可能的解决方案:

  • 使用web界面为您的项目增加此值(或禁用浅层克隆(
  • .gitlab-ci.yml重写变量GIT_DEPTH
  • 在回购的.gitlab-ci.yml脚本中使用标准克隆手动重新克隆回购
  • 停止依赖";旧的";散列

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

它帮助了我!

最新更新