2017-09-22 2 views
1

私は、そのブランチをチェックアウトすることなく、JGitのターゲットブランチの内容を表示したいと思っています。たとえば、現在のブランチがiss1の間にREADME.mdの内容がmasterブランチであることを示します。同等のGitコマンドは次のようにする必要があります:GitはJGitのターゲットブランチにファイルを表示しますか?

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

私はJGitを使ってどのようにすることができますか?

+0

https://stackoverflow.com/questions/10993634/how-do-i-do-git-show-sha1file-using-jgit – kan

答えて

1

JGitにはgit showと直接的には対応していませんが、コマンドによって実装されるAPIが実装されています。

あなたが持っているものがすべてブランチのリファレンスであれば、まずそのヘッドコミットのツリーIDを解決する必要があります。幸いにも、Repository::resolveが必要なツリーIDを返します式を受け付けます。

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

は、ツリーIDを考えると、あなたは、目的のファイルの内容を保持しているブロブIDを取得するためにTreeWalkを使用することができます。

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(); 

完全なソースコードはここで見つけることができます:Gitのオブジェクトデータベースの内部の仕組みの詳細についてはhttps://gist.github.com/rherrmann/0c682ea327862cb6847704acf90b1d5d

を、あなたはExplore Git Internals with the JGit APIを読むことをお勧めします。

関連する問題