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

How do I do “git show sha1” using 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();
     }

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

编辑:我意识到我在原来的 post 中不是很具体。

假设我在添加文件 (File1) 的位置进行提交 (Commit1)。然后我提交 (Commit2),在其中添加一个不同的文件 (File2)。然后我在修改 File2 的地方进行另一个提交 (Commit3)。无论出于何种原因,我现在都想从 Commit2 获取 File2 的内容。使用以上内容,树状步道将检索 Commit2 和 Commit1 的内容,这不是我想要的。

如您所见,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);
}