我想在 JGit 中显示目标分支的文件内容,而不检查该分支。例如,显示
README.md
分支的 master
的内容,而当前分支是 iss1
。等效的 Git 命令应该是:
myProj (iss1) $ git show master:README.md
Hello world!
如何使用 JGit 来做到这一点?
虽然 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 内部。