Git 在 JGit 的目标分支中显示文件?
Git show file in target branch in JGit?
我想在 JGit 中显示目标分支的文件内容而不签出该分支。例如,显示master
分支的README.md
的内容,而当前分支是iss1
。等效的 Git 命令应该是:
myProj (iss1) $ git show master:README.md
Hello world!
如何使用 JGit 来实现?
虽然在 JGit 中没有直接等同于 git show
,但它提供了 API 来实现命令自己执行的操作。
如果你只有一个分支的引用,那么你首先需要解析它的头部提交的树ID。幸运的是,Repository::resolve
接受一个表达式,它将 return 必要的树 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。
我想在 JGit 中显示目标分支的文件内容而不签出该分支。例如,显示master
分支的README.md
的内容,而当前分支是iss1
。等效的 Git 命令应该是:
myProj (iss1) $ git show master:README.md
Hello world!
如何使用 JGit 来实现?
虽然在 JGit 中没有直接等同于 git show
,但它提供了 API 来实现命令自己执行的操作。
如果你只有一个分支的引用,那么你首先需要解析它的头部提交的树ID。幸运的是,Repository::resolve
接受一个表达式,它将 return 必要的树 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。