GitLab CI管道中如何获取上次推送后所有变更文件?
在GitLab CI中获取上次推送的所有变更文件
核心思路
GitLab CI提供了两个关键环境变量来定位推送前后的提交节点:
CI_COMMIT_SHA:当前推送的最后一个提交的SHA值CI_COMMIT_BEFORE_SHA:推送前分支末端的提交SHA值(首次推送时该值为全0的SHA)
通过对比这两个SHA的差异,就能拿到本次推送所有提交中变更的文件。
基础实现脚本
# 判断是否为首次推送 if [ "$CI_COMMIT_BEFORE_SHA" = "0000000000000000000000000000000000000000" ]; then # 首次推送时,获取仓库所有文件(从空仓库到当前提交的所有变更) git diff --name-only --root $CI_COMMIT_SHA else # 对比推送前后的提交,列出所有变更文件 git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA fi
扩展用法
- 若需要查看文件变更状态(新增/修改/删除等),将
--name-only替换为--name-status,输出会附带状态标识(A=新增,M=修改,D=删除) - 如果需要过滤特定类型的文件,可结合
grep使用,比如只看Python文件:git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA | grep "\.py$"
CI配置注意事项
默认情况下GitLab CI会使用浅克隆(仅拉取最近少量提交),可能导致找不到CI_COMMIT_BEFORE_SHA对应的提交。需在job中设置拉取完整历史:
get_changed_files: variables: GIT_DEPTH: 0 # 拉取完整仓库历史 script: - | if [ "$CI_COMMIT_BEFORE_SHA" = "0000000000000000000000000000000000000000" ]; then git diff --name-only --root $CI_COMMIT_SHA else git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA fi
合并请求场景适配
如果是处理合并请求(MR)的job,可使用GitLab提供的MR专属变量来对比源分支和目标分支的差异:
git diff --name-only $CI_MERGE_REQUEST_TARGET_BRANCH_SHA $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA
内容的提问来源于stack exchange,提问作者Moritz
相关产品推荐
相关产品推荐

