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

标签 git egit jgit

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

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

最佳答案

看看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);

关于git - 我们如何使用 CommitIds 检查两个对象(即存储库中的文件内容)的相等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19700345/

相关文章:

git - 如何使用 JGit 创建和推送标签

windows - Git 仓库没有更新

linux - GIT:无法推送(奇怪的配置问题)

ruby - 如何使用 ruby​​-git 递归克隆远程存储库?

"time added to branch"的 Git 提交历史

java - 添加 GitLab 私有(private)仓库作为 Maven 依赖

使用 jgit 的 Java git 客户端

git - EGIT 说 Read timed out after 30,000 ms

eclipse - 在 Eclipse 中尝试从 eGit 提交到 git 时出现 "An internal error occurred"

JGit不拉远程重置