我如何使用 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);
}
基本上我想根据提交哈希读取提交中所有文件的内容。
我试过以下方法:
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);
}