【问题标题】:Get a list of files in a revision with JGit使用 JGit 获取修订中的文件列表
【发布时间】:2013-07-15 13:38:09
【问题描述】:

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

    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 文件的列表。欢迎提出任何建议。

【问题讨论】:

  • 我实际上检查了treeWalk.next()并使用treeWalk.getPathString(),可以得到所有文件的列表,我应该只比较包含“.java”的长字符串还是使用其他东西?

标签: java jgit


【解决方案1】:

建议使用像 PathSuffixFilter.create(".java") 这样的树形过滤器,而不是测试从 getPathString 返回的路径。

原因是getPathString 必须解码路径(内部是byte[]),而PathSuffixFilter 直接作用于byte[]

【讨论】:

  • 非常感谢。这是一个更好的方法。这几周我读了太多的 API,感到头晕目眩。这个是最复杂的。
  • 是的,API 很强大,但也可能很复杂。您对改进它有什么建议,或者在哪里添加更多文档?
  • 我是一个使用git api的新手,我觉得很难使用,因为网上的教程很少,其中一些使用了已弃用的api。 Google javaparser 项目的实现方式我喜欢
  • 我也觉得 jgit 很强大,但是 api 有改进的空间,在哪里讨论可能的变化最好?
  • @centic 见here,要么写信到邮件列表,要么在 Bugzilla 中提交新的增强。激进更改的提议可能会被拒绝,因为我们不想强迫现有用户更改他们的代码。但我认为改进或添加的想法,或文档补丁,都是受欢迎的。
【解决方案2】:

ls-tree 在 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 git-dev@eclipse.org 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();

【讨论】:

    猜你喜欢
    • 2017-03-28
    • 2014-11-26
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2019-02-15
    相关资源
    最近更新 更多