You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI/CD中分支新增文件夹检测失效求助

解决GitLab CI中新增文件夹检测问题

问题根源

  • GitLab CI默认采用浅克隆模式,仅拉取最新1次提交,导致git rev-parse HEAD~1常执行失败,脚本错误处理后会把所有旧目录误判为新增。
  • 直接对比两次提交的全量目录列表,无法区分「真正新增」和「删除后重新添加」的目录,结果准确性差。

修复后的完整CI配置

stage: detect
extends: .deploy_base
before_script:
  # 拉取足够提交历史,避免找不到上一次提交
  - git fetch --depth=2 || true
script:
  - echo "Detecting newly added folders between commits..."

  # 处理首次提交的特殊情况
  - |
    if git rev-parse HEAD~1 >/dev/null 2>&1; then
      PREV_COMMIT=$(git rev-parse HEAD~1)
      CURR_COMMIT=$(git rev-parse HEAD)
      # 筛选两次提交间新增的目录,去重后输出
      NEW_FOLDERS=$(git diff --name-only --diff-filter=A "$PREV_COMMIT" "$CURR_COMMIT" | xargs -I {} dirname {} | sort -u | grep -v '^.$')
    else
      # 首次提交时,所有目录均为新增
      NEW_FOLDERS=$(git ls-tree -d --name-only HEAD | sort)
    fi

  - |
    if [[ -z "$NEW_FOLDERS" ]]; then
      echo "no new folders" > new_folders.txt
    else
      echo "$NEW_FOLDERS" > new_folders.txt
    fi

  - echo "Detected folders:"
  - cat new_folders.txt

artifacts:
  paths:
    - new_folders.txt
  expire_in: 1 hour

核心修复点说明

  1. 解决浅克隆限制:通过git fetch --depth=2拉取最近两次提交历史,同时用|| true保证首次提交时脚本不会中断。
  2. 精准检测新增目录:用git diff --diff-filter=A直接筛选两次提交间新增的内容,再提取目录并去重,避免误判重复添加的目录。
  3. 覆盖边界场景:判断HEAD~1是否存在,首次提交时直接把当前所有目录标记为新增。

内容的提问来源于stack exchange,提问作者Vanessa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 11:15:08