gpt4 book ai didi

java - JGit:在分支中的提交处读取文件的内容

转载 作者:行者123 更新时间:2023-12-01 20:16:02 25 4
gpt4 key购买 nike

我想读取某个分支中某个提交处的文件内容:我目前正在使用此代码来读取某个提交处的文件内容,忽略该分支。

    public static String readContentOfFileAtCommit(String commitStr, String fileName)
throws IOException {

String content = null;
ObjectId lastCommitId = currentRepo.resolve(commitStr);

try (RevWalk revWalk = new RevWalk(currentRepo)) {
RevCommit commit = revWalk.parseCommit(lastCommitId);
RevTree tree = commit.getTree();

try (TreeWalk treeWalk = new TreeWalk(currentRepo)) {
treeWalk.addTree(tree);
treeWalk.setRecursive(true);
treeWalk.setFilter(PathFilter.create(fileName));
if (!treeWalk.next()) {
throw new IllegalStateException("Did not find expected file:" + fileName);
}

ObjectId objectId = treeWalk.getObjectId(0);
ObjectLoader loader = currentRepo.open(objectId);
content = new String(loader.getBytes());
}

revWalk.dispose();
}

return content;
}

我的目标是在某个分支上完成的某个提交中获取文件的内容。

最佳答案

与大多数较旧的 VCS 工具分支不同,Git 中的分支只是指向这些提交之一的轻量级可移动指针。它本身不“包含”任何提交。换句话说,它只是一个简单的文件,包含它指向的提交的 40 个字符 SHA-1 校验和。 Git - Branches in a Nutshell 中还有一个非常说明性的示例。 :

A branch and its commit history

正如 Rüdiger Herrmann 所说,虽然提交通常是在分支上创建的,但事后你不能说提交“是在分支上完成的”。之后可以添加、删除、重命名或更新分支。例如,即使删除了分支或标记 v1.0,提交 98ca934ac2f30ab仍然存在,并且可以由 master 访问。我建议您阅读Pro Git (2nd Edition), Chapter 3.1 Git - Branches in a Nutshell了解更多详情。

对于 JGit,这是我对特定提交的读取路径的实现:

private String getContent(RevCommit commit, String path) throws IOException {
try (TreeWalk treeWalk = TreeWalk.forPath(git.getRepository(), path, commit.getTree())) {
ObjectId blobId = treeWalk.getObjectId(0);
try (ObjectReader objectReader = repo.newObjectReader()) {
ObjectLoader objectLoader = objectReader.open(blobId);
byte[] bytes = objectLoader.getBytes();
return new String(bytes, StandardCharsets.UTF_8);
}
}
}

关于java - JGit:在分支中的提交处读取文件的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45793800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com