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

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的执行步骤中,克隆仓库后先执行命令恢复所有文件的原始提交时间,原有逻辑即可正常运行:

  1. 安装git-restore-mtime工具(Debian/Ubuntu系镜像为例)
apt update && apt install -y git-restore-mtime
  1. 执行恢复命令
git restore-mtime

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:39:04