Git 在 JGit 中显示目标分支中的文件?

问题描述 投票:0回答:1

我想在 JGit 中显示目标分支的文件内容,而不检查该分支。例如,显示

README.md
分支的
master
的内容,而当前分支是
iss1
。等效的 Git 命令应该是:

myProj (iss1) $ git show master:README.md
Hello world!

如何使用 JGit 来做到这一点?

java git jgit
1个回答
2
投票

虽然 JGit 中没有与

git show
直接等效的命令,但它提供了 API 来自行实现该命令的功能。

如果您拥有的只是对分支的引用,那么您首先需要解析其头提交的树 ID。幸运的是,

Repository::resolve
接受一个表达式,该表达式将返回必要的树ID:

ObjectId treeId = repository.resolve("refs/heads/master^{tree}");

给定树 id,您可以使用

TreeWalk
来获取保存所需文件内容的 blob id。

TreeWalk treeWalk = TreeWalk.forPath(git.getRepository(), "README.md", treeId);
ObjectId blobId = treeWalk.getObjectId(0);

forPath
工厂方法创建一个
TreeWalk
并将其放置在第二个参数中给出的路径处。

依次使用blob id,最终可以从Git的对象数据库中加载内容。

ObjectReader objectReader = repository.newObjectReader();
ObjectLoader objectLoader = objectReader.open(blobId);
byte[] bytes = objectLoader.getBytes();
objectReader.close();

完整的源代码可以在这里找到:https://gist.github.com/rherrmann/0c682ea327862cb6847704acf90b1d5d

有关 Git 对象数据库内部工作原理的更多详细信息,您可能需要阅读 使用 JGit API 探索 Git 内部

© www.soinside.com 2019 - 2024. All rights reserved.