5

jgit log コマンドを呼び出して、いくつかの RevCommit オブジェクトを取得しました。そこからいくつかの基本情報を取得できます。次のコードを使用して、変更されたファイルのリストを取得します。ただし、さらに2つの必要があります。

1) コミットに親がない場合、以下の情報を取得するにはどうすればよいですか?

2)各ファイルで変更されたコンテンツの差分を取得するにはどうすればよいですか

RevCommit commit = null;

RevWalk rw = new RevWalk(repository);

RevCommit parent = null;
if (commit.getParent(0) != null) {
   parent = rw.parseCommit(commit.getParent(0).getId());
}

DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE);
df.setRepository(repository);
df.setDiffComparator(RawTextComparator.DEFAULT);
df.setDetectRenames(true);

List<DiffEntry> diffs = df.scan(parent.getTree(), commit.getTree());
for (DiffEntry diff : diffs) {
   System.out.println(getCommitMessage());

   System.out.println("changeType=" + diff.getChangeType().name()
           + " newMode=" + diff.getNewMode().getBits()
           + " newPath=" + diff.getNewPath()
           + " id=" + getHash());
}
4

1 に答える 1

7

1) オーバーロードされたscanメソッドを使用し、AbstractTreeIterator親がない場合は次のように呼び出します。

df.scan(new EmptyTreeIterator(),
        new CanonicalTreeParser(null, rw.getObjectReader(), commit.getTree());

親がない場合は最初のコミットのみです。この場合、差分の「前」は空です。

2)git diffスタイル出力が必要な場合は、次を使用します。

df.format(diff);

そして差分は、コンストラクターに渡された出力ストリームに書き込まれます。したがって、各差分を個別に取得するには、DiffFormatterファイルごとに 1 つのインスタンスを使用できる必要があります。または、次のファイルをフォーマットする前に、コンテンツを取得してリセットすることもDiffFormatterできます。ByteArrayOutputStreamおおよそ次のようになります。

ByteArrayOutputStream out = new ByteArrayOutputStream();
DiffFormatter df = new DiffFormatter(out);
// ...
for (DiffEntry diff : diffs) {
    df.format(diff);
    String diffText = out.toString("UTF-8");
    // use diffText
    out.reset();
}

Git はファイルのエンコーディングを認識しないことに注意してください。これはtoString()メソッドで指定する必要があります。ここでは、妥当なデフォルトを使用しています。ユースケースによっては、 を使用してデコードしない方がよい場合がありますtoByteArray()


RevWalk一般的な注意事項:およびDiffFormatを使用して、常にリソースを解放するようにしてくださいrelease()

于 2012-09-19T15:06:07.663 に答える