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

如何使用isomorphic-git获取所有变更文件列表?

isomorphic-git 获取全量变更文件列表方法

原生git status可以直接输出全量变更,但isomorphic-git没有提供直接返回全量变更的单参数status调用,官方推荐通过statusMatrix接口实现,效率远高于遍历单文件调用status的方案。

推荐方案:使用 statusMatrix 接口

statusMatrix会一次性返回仓库内所有在HEAD、工作区、暂存区出现过的文件的状态矩阵,每个文件对应一条记录,结构为[文件路径, HEAD区状态, 工作区状态, 暂存区状态],状态码规则如下:

  • 0:文件在对应区域不存在
  • 1:文件在对应区域存在且内容无改动
  • 2:文件在对应区域存在但内容有改动
  • 3:文件存在合并冲突

你只需要过滤出三个状态值不全为1的文件,就是完整的变更文件列表,参考代码:

const git = require('isomorphic-git')
const fs = require('fs')

async function getAllChangedFiles(repoDir) {
  // 拉取全量文件状态矩阵
  const statusMatrix = await git.statusMatrix({
    fs,
    dir: repoDir
  })

  // 过滤变更文件
  return statusMatrix
    .filter(([_, headStatus, workdirStatus, stageStatus]) => {
      // 三个区域状态不全为1 = 存在变更
      return !(headStatus === 1 && workdirStatus === 1 && stageStatus === 1)
    })
    .map(([filepath]) => filepath)
}

// 调用示例:传入仓库根目录路径即可
getAllChangedFiles(process.cwd()).then(changedFiles => {
  console.log('全量变更文件:', changedFiles)
})

如果需要区分变更类型,直接根据三个状态值判断即可:

  • 未跟踪新增文件:headStatus === 0 && workdirStatus === 2 && stageStatus === 0
  • 已修改未暂存:headStatus === 1 && workdirStatus === 2 && stageStatus === 1
  • 已暂存待提交:headStatus === 1 && workdirStatus === 1 && stageStatus === 2
  • 已删除未暂存:headStatus === 1 && workdirStatus === 0 && stageStatus === 1
  • 合并冲突:任意状态值为3

旧版本兼容方案(不推荐)

如果使用的是0.x版本的isomorphic-git没有statusMatrix接口,可以先通过listFiles拿到所有已追踪文件,再逐个调用status判断状态,这个方案在文件量大的仓库性能很差,而且默认拿不到未跟踪的新增文件,需要额外遍历工作区做.gitignore过滤,实现成本很高:

async function getChangedFilesLegacy(repoDir) {
  const trackedFiles = await git.listFiles({ fs, dir: repoDir })
  const changedList = []
  for (const filepath of trackedFiles) {
    const fileStatus = await git.status({ fs, dir: repoDir, filepath })
    if (fileStatus !== 'unmodified') {
      changedList.push(filepath)
    }
  }
  return changedList
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:27:17