Node.js如何从新克隆的Git仓库指定目录获取最新添加的文件
问题根因
Git默认克隆操作不会保留文件在仓库中的原始创建/修改时间,所有文件的ctime、mtime都会被设置为克隆完成时的系统时间。你在Bitbucket Pipeline中每次执行都是全新克隆,所以tests目录下所有文件的时间戳完全相同,排序逻辑失去判断依据,最终返回随机结果。本地环境因为文件存在修改、编辑等操作,时间戳有差异,所以运行正常。
修复方案
方案1:基于Git提交时间排序(推荐)
直接使用Git记录的文件最后一次提交时间作为排序依据,完全不受文件系统时间影响,适配所有CI环境。
实现代码如下:
const { execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); // 获取指定文件最后一次提交的时间戳 const getFileLastCommitTime = (filePath) => { const output = execSync(`git log -1 --format=%ct "${filePath}"`, { encoding: 'utf8', cwd: process.cwd() }).trim(); return Number(output) * 1000; }; const orderReccentFiles = (dir) => { return fs.readdirSync(dir) .filter((file) => fs.statSync(path.join(dir, file)).isFile()) .map((file) => ({ file, commitTime: getFileLastCommitTime(path.join(dir, file)) })) .sort((a, b) => b.commitTime - a.commitTime) .map(file => "tests/" + file.file); }; const getMostRecentFiles = (dir, numberOfFiles) => { const files = orderReccentFiles(dir); return files.length ? files.slice(0, numberOfFiles) : undefined; }; // 调用逻辑保持不变 const tests = getMostRecentFiles('./tests', numberOfFiles);
方案2:恢复文件系统时间(无代码修改)
如果你不想调整现有代码,可以在Bitbucket Pipeline的执行步骤中,克隆仓库后先执行命令恢复所有文件的原始提交时间,原有逻辑即可正常运行:
- 安装
git-restore-mtime工具(Debian/Ubuntu系镜像为例)
apt update && apt install -y git-restore-mtime
- 执行恢复命令
git restore-mtime
内容的提问来源于stack exchange,提问作者ASayed
相关产品推荐
相关产品推荐

