基本上我想根据提交哈希读取提交中所有文件的内容。
我尝试了以下内容:
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的内容,这不是我想要的。
答案 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);
}