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

时间:2017-09-22 15:18:35

标签: java git jgit

我想在JGit中显示目标分支的文件内容而不检查该分支。例如,在当前分支为README.md时显示master分支iss1的内容。等效的Git命令应该是:

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

如何使用JGit进行操作?

1 个答案:

答案 0 :(得分:1)

虽然在JGit中没有直接等同于git show,但它提供了API来实现命令自己执行的操作。

如果您拥有的只是对分支的引用,那么您首先需要解析其头部提交的树ID。幸运的是,Repository::resolve接受一个表达式,该表达式将返回必要的树ID:

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

给定树ID,您可以使用TreeWalk来获取包含所需文件内容的blob id。

TreeWalk treeWalk = TreeWalk.forPath( git.getRepository(), "readme", masterTreeId );
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对象数据库内部工作原理的更多详细信息,您可能需要阅读Explore Git Internals with the JGit API