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

如何获取Git仓库中近6个月未更新/变更的文件列表

问题原因

你之前的代码有两个致命问题,导致结果完全不符合预期:

  • find的-mtime参数用反了:-mtime -2匹配的是2天内修改过的文件,要找N天前修改(之后没动过)的文件,需要用-mtime +N
  • 完全用错了判断依据:GitLab CI默认做浅克隆,且每次流水线运行时工作目录的文件都是新拉取的,文件系统记录的mtime是拉取代码的时间,根本不是文件在版本历史里的最后修改时间,靠find -mtime在CI环境里拿的结果从根上就不准。
可直接用的实现方案

首先先修正CI的克隆配置,否则拿不到完整提交历史,在你的.gitlab-ci.yml全局变量里加一行,关闭浅克隆:

variables:
  GIT_DEPTH: "0"

之后用Git自带的日志能力查每个文件的最后提交时间,这个时间是从提交记录里读的,完全不受runner本地文件系统影响,准确性有保障。完整的流水线配置参考:

generate_stale_file_report:
  script:
    - git fetch origin master
    - git checkout master
    # 计算6个月前的unix时间戳,做对比基准
    - CUTOFF_TS=$(date -d "6 months ago" +%s)
    # 初始化报告文件
    - echo "=== 近6个月未变更文件列表 ===" > 6month_stale_files.txt
    - echo "格式:文件存储路径 | 最后一次提交修改时间" >> 6month_stale_files.txt
    # 遍历python目录下所有普通文件,筛选符合条件的项
    - |
      while read -r filepath; do
        file_last_commit_ts=$(git log -1 --format="%ct" -- "$filepath")
        file_last_commit_time=$(git log -1 --format="%cd" --date=iso -- "$filepath")
        if [ "$file_last_commit_ts" -lt "$CUTOFF_TS" ]; then
          echo "$filepath | $file_last_commit_time" >> 6month_stale_files.txt
        fi
      done < <(find python -type f)
    # 控制台打印报告,方便直接在CI日志里查看
    - cat 6month_stale_files.txt
  artifacts:
    paths:
      - 6month_stale_files.txt
    expire_in: 30 days
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule"'  # 仅定时流水线触发执行
补充说明
  • 如果你需要扫描其他目录,把find python -type f里的python替换成目标目录路径即可,扫描整个仓库就替换成.,脚本会自动排除.git目录下的内容
  • 不要尝试用修正参数后的find -mtime +180实现需求,只要是在CI全新工作目录的场景下,文件系统mtime永远是拉代码的时间,跑出来的结果没有任何参考价值
  • 时间计算用date -d "6 months ago"会自动处理大小月的问题,不需要手动算180天的偏差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:01:40