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

