2013-07-15 75 views
0

有谁知道如何使用JGit API来获取文件列表?我试图找到像使用上的本地存储库中的git show命令类似的功能,如获取与JGit修订文件列表

git ls-tree -r --name-only 7feff221f86e040f0cd2e4227e9e1496fe16f376 

我有一个像在本地存储库

File gitDir = new File("/Users/xiansongzeng/NIOServer"); 
    Git git = Git.open(gitDir); 
    Repository repo = git.getRepository(); 

    ObjectId lastCommitId = repo.resolve("7feff221f86e040f0cd2e4227e9e1496fe16f376"); 
    RevWalk revWalk = new RevWalk(repo); 
    RevCommit commit = revWalk.parseCommit(lastCommitId); 
    RevTree tree= commit.getTree(); 
    TreeWalk treeWalk = new TreeWalk(repo); 
    treeWalk.addTree(tree); 
    treeWalk.setRecursive(true); 

    treeWalk.setFilter(PathFilter.create("src/main/java/nds/socket/server/Reader.java")); 
    if(!treeWalk.next()){ 
     System.out.println("Not found."); 
     return; 
    } 
    ObjectId objectId = treeWalk.getObjectId(0); 

此代码的目标一些代码,使用RevWalk走最后一次提交的修订树。我发现这个例子使用PathFilter来获取文件的引用,但不知道如何获取所有Java文件的列表。任何建议都是值得欢迎的。

+0

我实际检查treeWalk.next()和树遍历使用.getPathString()可以获得所有文件的列表,我应该比较一下包含“.java”的长字符串还是使用其他内容? – Xiansong

回答

1

建议在测试从getPathString返回的路径上使用树形过滤器,如PathSuffixFilter.create(".java")

这样做的原因是,具有getPathString到路径(这是一个byte[]内部)进行解码,而PathSuffixFilter是直接对byte[]

+0

非常感谢。这是一个更好的方法。这几周我正在阅读太多的API,并感到头晕目眩。这是最复杂的。 – Xiansong

+0

是的,API功能强大但可能很复杂。你有任何改进它的建议,或者在哪里添加更多文档? – robinst

+0

我是一个使用git api的新手,我发现很难使用,因为有几行教程和其中一些使用弃用的api。我喜欢Google javaparser项目实现的方式。它将界面和抽象类分开,清楚地说明每个类和包的意图。 – Xiansong

0

LS-树在JGit实现:org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/LsTree.java 用法 jgit ls-tree [-r|--recursive] <tree-ish> [-- paths...]

和CAT-file是简单(credit goes to Shawn Pearce at [email protected] mailing list

int type; 
    if (argv[0].equals("blob")) 
    type = Constants.OBJ_BLOB; 
    ... 

    ObjectId id = ObjectId.fromString(argv[1]); 
    ObjectLoader ldr = db.open(id, type); 
    byte[] tmp = new byte[1024]; 
    InputStream in = ldr.openInputStream(); 
    int n; 
    while ((n = in.read(tmp)) > 0) 
    System.out.write(tmp, 0, n); 
    in.close();