我想在某个分支中的某个提交中读取文件的内容:我目前正在使用此代码在某个提交时读取文件的内容而忽略该分支。
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中还有一个非常具有说明性的例子:
正如RüdigerHerrmann所说,虽然通常在分支上创建提交,但事实之后你不能说提交“在分支上完成”。之后可以添加,删除,重命名或更新分支。例如,即使删除分支或标记v1.0
,提交98ca9
,34ac2
,f30ab
仍然存在,并且可以通过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);
}
}
}