2013-06-25 7 views
5

Contex

作業コピーで最後にコミットした後に発生する可能性のあるファイルの名前変更を検出しようとしています。 私の例では、私はクリーンな作業コピーを持っていると私はそれを行う:$ git statusを実行JGitが作業コピーの名前の変更を検出しました。

git mv old.txt new.txt 

が期待された結果を示しています。

# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  renamed: old.txt -> new.txt 

を私はStatusCommandを使用し

を試してみましたが、私が見ることができます削除リストにold.txt、追加リストにnew.txtが追加されました。 しかし、私はそれらを一緒にリンクする方法を見つけることができません。

私はRenameDetectorの存在を認識してんだけど、それはDiffEntryを使用して動作し、私はHEAD作業コピー間DiffEntriesを取得する方法がわかりません。

答えて

7

心配しないで、答えが見つかりました。 JGitのAPIは非常に複雑です。..

TreeWalk tw = new TreeWalk(repository); 
tw.setRecursive(true); 
tw.addTree(CommitUtils.getHead(repository).getTree()); 
tw.addTree(new FileTreeIterator(repository)); 

RenameDetector rd = new RenameDetector(repository); 
rd.addAll(DiffEntry.scan(tw)); 

List<DiffEntry> lde = rd.compute(tw.getObjectReader(), null); 
for (DiffEntry de : lde) { 
    if (de.getScore() >= rd.getRenameScore()) { 
     System.out.println("file: " + de.getOldPath() + " copied/moved to: " + de.getNewPath()); 
    } 
} 

(このコードはまた、Gitectiveライブラリを使用)

関連する問題