从JGit中的RevCommit对象获取提交信息

时间:2012-09-19 11:36:52

标签: git jgit

我调用了jgit log命令并找回了一些RevCommit对象。我可以从中获取一些基本信息,并使用以下代码获取更改的文件列表。我还需要做两件事:

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

1 个答案:

答案 0 :(得分:7)

1)将重载的scan方法与AbstractTreeIterator一起使用,如果没有父级,请按如下方式调用:

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

没有父项的情况仅适用于初始提交,在这种情况下,差异的“之前”为空。

2)如果您想要git diff样式输出,请使用以下内容:

df.format(diff);

并且diff将被写入传递给构造函数的输出流。因此,为了单独获取每个差异,应该可以为每个文件使用一个DiffFormatter实例。或者您可以使用一个DiffFormatterByteArrayOutputStream,在格式化下一个文件之前获取内容并重置它。大概是这样的:

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释放DiffFormatrelease()的资源。