我们如何使用CommitIds检查两个对象的相等性,即存储库中的文件内容?

时间:2013-10-31 07:10:18

标签: git egit jgit

我有一个场景,我需要检查两个文件的内容是否相等 我所拥有的是JGIT存储库的两个文件的commitIds。

是否有可能使用(文件)对象的commitIds检查相等性,而不完全比较内容。

1 个答案:

答案 0 :(得分:2)

查看RevObjectTest.java测试类:

assertTrue(AnyObjectId.equals(a1, a2));
assertTrue(AnyObjectId.equals(b1, b2));

如果两个文件有两个ObjectID,则可以使用org.eclipse.jgit.lib.AnyObjectId util类来比较SHA1。
如果SHA1匹配,则文件的内容匹配,因为SHA1是内容的散列。

要查找特定文件的ObjectId,请遵循由ReadFileFromCommit.java(也是JGit cookbook)撰写的优秀centic9 (Dominik Stadler)中的Stack Overflow user

ObjectId lastCommitId = repository.resolve(Constants.HEAD);

// a RevWalk allows to walk over commits based on some filtering that is defined
RevWalk revWalk = new RevWalk(repository);
RevCommit commit = revWalk.parseCommit(lastCommitId);
// and using commit's tree find the path
RevTree tree = commit.getTree();
System.out.println("Having tree: " + tree);

// now try to find a specific file
TreeWalk treeWalk = new TreeWalk(repository);
treeWalk.addTree(tree);
treeWalk.setRecursive(true);
treeWalk.setFilter(PathFilter.create("README.md"));
if (!treeWalk.next()) {
  throw new IllegalStateException("Did not find expected file 'README.md'");
}

ObjectId objectId = treeWalk.getObjectId(0);