2016-09-27 3 views
1

JGitライブラリを使用して2つのコミット間の差分をプログラムで検索しようとしています。diffはJGitでマージコミットを処理します

は、私は、次の階層をコミット持っていると仮定します - diffコマンドは6で、マージを参照するか、7

---1---2---3---4---5---6---7---8-- 
     \--9-—10—-11--/ 

今度は、私は4をコミット間の差分を解析してると言ってみましょうか? 以前のコミット(4以前)に関連する情報、たとえば2?

私は差分を決定するために、次のコードを使用しています:

private static List<DiffEntry> getDiffsBetweenCommits(String repositoryWorkDir, String fromCommit, String toCommit) { 
    List<DiffEntry> diffs = null; 
    try { 

     // Access GIT repository 
     File workDir = new File(repositoryWorkDir); 
     Git git = Git.open(workDir); 
     repository = git.getRepository(); 

     // Locate commit references 
     ObjectId current = repository.resolve(toCommit + "^{tree}"); 
     ObjectId previous = repository.resolve(fromCommit + "^{tree}"); 

     // Generate tree iterators 
     ObjectReader reader = git.getRepository().newObjectReader(); 
     CanonicalTreeParser oldTreeIter = new CanonicalTreeParser(); 
     oldTreeIter.reset(reader, previous); 
     CanonicalTreeParser newTreeIter = new CanonicalTreeParser(); 
     newTreeIter.reset(reader, current); 

     // Calculate GIT differences 
     diffs = git.diff() 
       .setNewTree(newTreeIter) 
       .setOldTree(oldTreeIter) 
       .call(); 
    } catch (Exception e) { 
     System.out.println("Error analyzing commit's diffs"); 
     e.printStackTrace(); 
    } 
    return diffs; 
} 

それは私が4よりもはるかに古いコミットで変更されたファイルを取得しています、と私は私が原因マージのそれらを得ることを疑います私はそれを自分自身に説明することができるでしょう。

diff解析ロジックを理解していただきありがとうございます。

答えて

0

もっと一般的なGitの文脈に入れるには、この質問の言い換えをよくする方がよいかもしれません。

他のSCMと違って、Gitは親コミットとの差分だけでなくコミットの完全な内容を保存します。各コミットは、それぞれのファイル内容へのポインタと共にコミット内のすべてのファイルをリストする、いわゆる「ツリー」を参照します。

コミットが作成されると、その親のツリーが取得され、ステージングされたすべての変更(追加、変更、削除)が適用され、結果の(新しい)ツリーがコミットメタデータとともに格納されます。その内容に関して、各コミットはその親を参照することなく再構築することができる。

例の各コミットが1つの一意のファイルを追加したとしましょう。コミット#6を見ると、1から6までのすべてのファイルと9,10,11のファイルがすべて含まれています。したがって、 'git diff 4 6'はコミット#4のツリーとコミット#6のツリーを比較します(それまでのあなたの履歴のすべてのファイルを含む)。

Gitのストレージ内部構造の詳細については、次の記事をお読みください。http://www.codeaffine.com/2014/10/20/git-internals/この投稿には、JGitによる結果を調べる自己完結型の学習テストが含まれています。

関連する問題