我想在JGit中显示目标分支的文件内容,而不 checkout 该分支。例如,显示当前分支为iss1时master分支的README.md的内容。等效的Git命令应该是:
iss1
master
README.md
myProj (iss1) $ git show master:README.md Hello world!
如何使用JGit?
nlejzf6q1#
虽然在JGit中没有与git show直接等价的东西,但它提供了API来实现命令本身的功能。如果你所拥有的只是一个分支的引用,那么你首先需要解析它的头提交的树id。幸运的是,Repository::resolve接受一个表达式,该表达式将返回必要的树id:
git show
Repository::resolve
ObjectId treeId = repository.resolve("refs/heads/master^{tree}");
给定树ID,您可以使用TreeWalk来获取包含所需文件内容的blob ID。
TreeWalk
TreeWalk treeWalk = TreeWalk.forPath(git.getRepository(), "README.md", treeId); ObjectId blobId = treeWalk.getObjectId(0);
forPath工厂方法创建一个TreeWalk,并将其放置在第二个参数中给出的路径上。有了blob id,你就可以从Git的对象数据库中加载内容了。
forPath
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。
1条答案
按热度按时间nlejzf6q1#
虽然在JGit中没有与
git show
直接等价的东西,但它提供了API来实现命令本身的功能。如果你所拥有的只是一个分支的引用,那么你首先需要解析它的头提交的树id。幸运的是,
Repository::resolve
接受一个表达式,该表达式将返回必要的树id:给定树ID,您可以使用
TreeWalk
来获取包含所需文件内容的blob ID。forPath
工厂方法创建一个TreeWalk
,并将其放置在第二个参数中给出的路径上。有了blob id,你就可以从Git的对象数据库中加载内容了。
完整的源代码可以在这里找到:https://gist.github.com/rherrmann/0c682ea327862cb6847704acf90b1d5d
有关Git对象数据库内部工作的更多详细信息,您可能需要阅读Explore Git Internals with the JGit API。