7

我有两个分支mastermaster.min在我的仓库中。

假设我当前的分支是master.min.

我的主分支正在提交 -abcd

一些推送发生在主分支 - efgh,ijkl

我存储我的主分支的当前提交:

 repo.getBranchCommit("master")
        .then(function(commit) {
            startCommit = commit;
        })

由于分支之间的切换时间长,我需要完成所有剩余的操作master.min

所以,我做了一个提取:

repo.fetch("master");

现在,我需要获取在abcd&之间添加、修改或删除的所有文件的列表ijkl

commit.getDiff() is not enough. I need diff between two commits.
4

2 回答 2

5

对于那些寻求更明确答案的人:

const nodegit = require('nodegit');
const repo = await nodegit.Repository.open(repoDirectory);

const from = await repo.getCommit(fromCommitSHA);
const fromTree = await from.getTree();

const to = await repo.getCommit(toCommitSHA);
const toTree = await to.getTree();

const diff = await toTree.diff(fromTree);
const patches = await diff.patches();

for (const patch of patches) {
    console.log(patch.newFile().path());
}

每个补丁都代表一个修改过的文件,并且是ConvenientPatch. 它有两个方法oldFile(),分别返回一个表示修改前后文件newFile()的实例。DiffFile

NodeGit API 文档:

于 2020-12-02T18:39:34.940 回答
3

我也需要这个,但nodegit似乎还不支持。

看看https://github.com/nodegit/nodegit/blob/master/lib/commit.js#L196我看到差异是通过比较提交树和父树来计算的:

return thisTree.diffWithOptions(parentTree, options)

所以,我假设这可以通过实现一个变体来实现,commit#getDiff它接收另一个提交的 OID 并调用tree1 = this.getTree()然后tree2 = getTheOtherCommit(OID).getTree()调用tree1.diffWithOptions(tree2, options)

当然这getTheOtherCommit是伪代码,但这只是为了描绘这个想法。

我会尽快尝试实施它并在此处发布进度。

于 2016-02-29T05:45:59.880 回答