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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:57:22