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

Posted

技术标签:

【中文标题】如何用 jgit 做相当于“git diff --name-status”的操作?【英文标题】:How do I do the equivalent of "git diff --name-status" with jgit? 【发布时间】:2012-01-21 04:24:46 【问题描述】:

我想获取修订版 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() 所需的树?

【问题讨论】:

这是一个很好的问题,尽管 OP 专门只询问了 --name-status,因为它适用于所有 jgit.Git.diff() 类型的问题,恕我直言,这些问题的例子很少,而且API 文档倾斜。那谢谢啦!也感谢@Kevin Sawicki 和@ktoso 的回答! 【参考方案1】:

您可以通过调用获取 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();

【讨论】:

谢谢!今晚我会试一试。 完美运行。再次感谢! 我还发现 DiffCommand 的测试在实现差异时非常有用 - 所以我想我会分享链接:-) git.eclipse.org/c/jgit/jgit.git/tree/org.eclipse.jgit.test/tst/…

以上是关于如何用 jgit 做相当于“git diff --name-status”的操作?的主要内容,如果未能解决你的问题,请参考以下文章

JGit 中的 git diff 等价物

php 如何实现 git diff

如何用两块硬盘做磁盘阵列Raid 1

Jgit中'pull'命令的使用

如何从 git diff 读取输出?

如何从 git diff 读取输出?