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

在VS Code扩展中如何获取两个Git分支间的变更统计数据?

获取VS Code扩展中Git分支间代码变更数量的解决方案

我在开发VS Code扩展时,需要获取两个Git分支之间的代码变更统计数据——比如分支A中有一个10行的文件,分支B修改后变成15行,要得到新增5行的差异数据。终端里执行git diff branchA branchB --shortstat能返回类似1 file changed, 5 insertions(+), 0 deletions(-)的结果,但VS Code的API(包括Source Control API)里没有直接提供获取这类数据的方法。

最终通过Node.js的异步进程创建功能解决了问题,这也是官方Git扩展和GitLens的实现思路。使用child_process模块的spawn方法执行Git命令,捕获输出后解析即可得到所需数据。

核心实现代码(TypeScript)

import * as vscode from 'vscode';
import { spawn } from 'child_process';

async function getBranchDiffStats(branchA: string, branchB: string): Promise<string> {
    return new Promise((resolve, reject) => {
        const workspaceFolder = vscode.workspace.workspaceFolders?.[0].uri.fsPath;
        if (!workspaceFolder) {
            reject('未打开工作区文件夹');
            return;
        }

        // 执行git diff命令
        const gitProcess = spawn('git', ['diff', branchA, branchB, '--shortstat'], { cwd: workspaceFolder });
        
        let output = '';

        // 捕获标准输出
        gitProcess.stdout.on('data', (data) => {
            output += data.toString();
        });

        // 捕获错误输出
        gitProcess.stderr.on('data', (data) => {
            reject(data.toString());
        });

        // 进程结束后处理结果
        gitProcess.on('close', (code) => {
            if (code === 0) {
                resolve(output.trim());
            } else {
                reject(`Git进程退出,代码:${code}`);
            }
        });
    });
}

// 示例调用
async function exampleUsage() {
    try {
        const stats = await getBranchDiffStats('branchA', 'branchB');
        vscode.window.showInformationMessage(`分支差异统计:${stats}`);
    } catch (error) {
        vscode.window.showErrorMessage(`获取差异失败:${error}`);
    }
}

这段代码会在当前工作区执行Git diff命令,捕获输出后返回格式化的统计字符串。你可以进一步解析输出字符串,提取出文件变更数、新增行数、删除行数等具体数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:57:04