如何使用 jgit 执行相当于“git diff --name-status”的操作?

2023-11-26

我想获取修订版 XXXXXX 和 HEAD 之间更改/添加/删除的文件列表。这是我到目前为止所拥有的:

String oldHash = "a97e5553e37a25bd1a3c99eab303145baed08dbd";
Git git = Git.open(new File("/tmp/jgit"));
Repository repository = git.getRepository();
ObjectId old = repository.resolve(oldHash);
ObjectId head = repository.resolve("HEAD");

// how do i get the trees from the obj. id?
List<<DiffEntry> diffs = git.diff().setNewTree(null).setOldTree(null).call();

for(DiffEntry diff : diffs) {
    // do stuff
}

这是正确的方法吗?如果是,我如何获取 git.diff() 所需的树?


您可以通过调用以下命令获取 HEAD 的树 ID 和哈希值:

ObjectId head = repository.resolve("HEAD^{tree}");

对于修订 ID:

ObjectId old = repository.resolve(oldHash + "^{tree}");

获得树 id 后,您可以创建树迭代器并获取差异:

ObjectReader reader = repository.newObjectReader();
CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
oldTreeIter.reset(reader, oldId);
CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
newTreeIter.reset(reader, headId);
List<DiffEntry> diffs= git.diff()
                        .setNewTree(newTreeIter)
                        .setOldTree(oldTreeIter)
                        .call();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 jgit 执行相当于“git diff --name-status”的操作? 的相关文章

随机推荐