JGit:读取分支中提交的文件内容

问题描述 投票:0回答:1

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

    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;
}

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

java jgit
1个回答
3
投票

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

A branch and its commit history

正如RüdigerHerrmann所说,虽然通常在分支上创建提交,但事实之后你不能说提交“在分支上完成”。之后可以添加,删除,重命名或更新分支。例如,即使删除分支或标记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);
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.