当前位置: 首页 > 知识库问答 >
问题:

使用JGit获取修订版中的文件列表

傅阿苏
2023-03-14

有人知道如何使用JGit API获取文件列表吗?我试图在本地存储库中找到类似的函数,比如使用<code>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来获取文件的引用,但是dunno如何获取所有Java文件的列表。欢迎任何建议。

共有2个答案

从智志
2023-03-14

ls-tree是在JGit中实现的:org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/LsTree.java用法是jgit ls-tree[-r|--递归]

猫档很简单(这要归功于git-dev@eclipse.org邮件列表中的肖恩·皮尔斯)

  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();

董霖
2023-03-14

使用像< code>PathSuffixFilter.create(")这样的树过滤器。建议使用java")来测试从< code>getPathString返回的路径。

这样做的原因是getPathString必须解码路径(内部是一个byte[]),而PathSendfilter直接在byte[]上工作。

 类似资料:
  • 问题内容: 我一直在研究将要集成Git功能的基于Java的产品。使用Git的功能之一,我通过分阶段执行将10多个文件添加到Git存储库中,然后在一次提交中提交了这些文件。 以上过程可能相反吗?即查找作为提交的一部分提交的文件列表。 我在命令的帮助下获得了提交,但是我不确定如何获取提交的文件列表。 示例代码: 问题答案: 每个提交都指向一 棵树 ,该 树 表示构成该提交的所有文件。注意,这不仅包括使

  • 我一直在开发一个基于Java的产品,Git特性将被集成到该产品中。通过使用Git的一个特性,我将10个文件添加到Git存储库中,然后在一次提交中提交。 上述过程是否可能相反?即查找作为提交的一部分提交的文件列表。 我在< code>git.log()命令的帮助下获得了提交,但是我不确定如何获得提交的文件列表。 示例代码:

  • 问题内容: 我正在尝试使用jGit克隆存储库并签出特定的提交。 假设提交哈希为:1e9ae842ca94f326215358917c620ac407323c81。 我的第一步是: 然后,我发现了另一个提出这种方法的问题: 但是我不确定如何将两者链接在一起? 有什么想法吗? 问题答案: 您将必须首先克隆存储库,因此第一步是正确的: 要仅通过ID检出提交,可以这样调用: 但是请注意,这将导致HEAD分

  • 问题内容: 我想使用Java JGit库来检索先前提交的文件修订。该文件每天都会更新,我需要从git存储库访问以前的版本。 我知道如何通过提供提交的修订我需要哈希,如所描述检出一个特定的修订版本在这里用这个命令: 当前,我克隆存储库,搜索该文件的最新提交,然后签出修订版。我现在的过程很麻烦,因为我每次都需要重新检出存储库。我宁愿只是从特定修订版(例如,master分支)中导出单个文件。 修订日志

  • 我正在尝试从起源/mybranch 重新定位 mybranch。我正在使用这个代码: 执行此操作后,冲突的文件将更新为注释,例如 但是,即使我已经提交了本地更改,没有冲突的本地更改也会被存储库内容覆盖。 如果我试图在命令提示符下运行git命令“git-rebase”,而不是调用这个函数,本地文件不会更新,所以这很好。 后来我尝试了以下链接方法, https://github.com/centic9

  • 我想使用JGit显示头部修订版的所有文件和文件夹的列表。我可以使用 TreeWalk 列出所有文件,但这不会列出文件夹。 以下是我到目前为止的情况: