如何获取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
相关产品推荐
相关产品推荐

