如何使用JGit执行“git show sha1”

时间:2016-07-29 17:53:09

标签: java git show commit jgit

基本上我想根据提交哈希读取提交中所有文件的内容。

我尝试了以下内容:

try(RevWalk revWalk = new RevWalk(gitRepository))
     {
        RevCommit commit = revWalk.parseCommit(ObjectId.fromString(commitSha));
        RevTree tree = commit.getTree();

        try(TreeWalk treeWalk = new TreeWalk(gitRepository))
        {
           treeWalk.addTree(tree);
           treeWalk.setRecursive(true);

           ObjectId entryId = null;

           while (treeWalk.next())
           {
              entryId = treeWalk.getObjectId(0);
           }

           ObjectLoader loader = gitRepository.open(entryId);
        }

        revWalk.dispose();
     }

但它似乎也从以前的提交中获取文件。

编辑:我意识到我在原帖中并不是很具体。

假设我在一个提交(Commit1)的地方添加了一个文件(File1)。然后我做了一个提交(Commit2),我添加了一个不同的文件(File2)。然后我做了另一个提交(Commit3)我修改了File2。我现在想以任何理由从Commit2获取File2的内容。使用上面的方法,treewalk将检索Commit2 AND Commit1的内容,这不是我想要的。

1 个答案:

答案 0 :(得分:0)

正如您所注意到的,Git不会将提交存储为先前提交的差异,它会将提交存储为该时间点的整个存储库的快照。

这并不是非常明显,因为即使git show <commitid>也会在提交及其父级之间提供差异。但是当你像你已经完成的那样迭代提交的内容时,它就变得清晰了。

如果您想模拟git show <commitid>并查看提交引入了哪些更改,则需要将其与其父级进行比较。

Git git = new Git(gitRepository);

ObjectId newTreeId = ObjectId.fromString(commitSha + "^{tree}");
ObjectId oldTreeId = gitRepository.resolve(commitSha + "^^{tree}");

CanonicalTreeParser newTree = new CanonicalTreeParser();
newTree.reset(reader, newTreeId);

CanonicalTreeParser oldTree = new CanonicalTreeParser();
oldTree.reset(reader, oldTreeId);

for (DiffEntry de : git.diff().setNewTree(newTree).setOldTree(oldTree).call())
{
    /* Print the file diff */
    DiffFormatter formatter = new DiffFormatter(System.out);
    formatter.setRepository(gitRepository);
    formatter.format(de);
}