JGit Traverse仅限本地和远程分支HEAD并读取文件

时间:2014-01-13 13:43:14

标签: java git jgit

我想遍历我的git repo,但只需要包含远程分支的HEAD提交。 我只有本地主分支和许多远程分支。 我可以遍历我的实际工作目录,如。

    Ref head = repository.getRef("HEAD");
    RevWalk walk = new RevWalk(repository);

    RevCommit commit = walk.parseCommit(head.getObjectId());
    RevTree tree = commit.getTree();

    TreeWalk treeWalk = new TreeWalk(repository);
    treeWalk.addTree(tree);
    treeWalk.setRecursive(true);
    while (treeWalk.next()) {
        System.out(treeWalk.getPathString())
    }
    repository.close();

但是这段代码只遍历实际的工作目录。 之后我想读取头部提交中的文件。 我如何进行阅读和遍历分支?

2 个答案:

答案 0 :(得分:1)

使用RefDatabase#getRefs浏览现有的参考:

RefDatabase refDatabase = repository.getRefDatabase();
Map<String, Ref> refs = refDatabase.getRefs(Constants.R_REMOTES);
for (Ref remoteRef : refs) {
    // ...
}

getRefs的参数是仅获取某些引用的前缀,您也可以使用RefDatabase.ALL来获取所有引用。

要读取文件内容,请按照问题代码中的方式遍历树。然后,使用TreeWalk对象,可以读取内容。请参阅this answer问题中的How to “cat” a file in JGit?

答案 1 :(得分:0)

好的,这段代码向我显示了所有内容,但没有按照我想要的正确顺序。 它从一个随机的远程分支开始。

for (Map.Entry<String, Ref> entry : refList.entrySet()) {
            Ref head = repository.getRef(entry.getValue().getName());
            RevWalk walk = new RevWalk(repository);
            RevCommit commit = walk.parseCommit(head.getObjectId());
            RevTree tree = commit.getTree();
            TreeWalk treeWalk = new TreeWalk(repository);
            treeWalk.addTree(tree);
            treeWalk.setRecursive(true);
            while (treeWalk.next()) {
                    ObjectId objectId = treeWalk.getObjectId(0);
                    ObjectLoader loader = repository.open(objectId);
                    loader.copyTo(System.out);
            }
}