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
核心修复点说明
- 解决浅克隆限制:通过
git fetch --depth=2拉取最近两次提交历史,同时用|| true保证首次提交时脚本不会中断。 - 精准检测新增目录:用
git diff --diff-filter=A直接筛选两次提交间新增的内容,再提取目录并去重,避免误判重复添加的目录。 - 覆盖边界场景:判断
HEAD~1是否存在,首次提交时直接把当前所有目录标记为新增。
内容的提问来源于stack exchange,提问作者Vanessa
相关产品推荐
相关产品推荐

