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

如何在Jgit中获取作为提交一部分的文件列表

鲁斯伯
2023-03-14

我想获取作为提交一部分的所有文件的列表。我有可用的提交ID。

我查看了以下链接

如何使用JGit获取提交的文件列表

并尝试了下面的代码。

TreeWalk treeWalk = new TreeWalk( repository );
treeWalk.reset( commit.getId() );
while( treeWalk.next() ) {
  String path = treeWalk.getPathString();
  // ...
}
treeWalk.close();

和以下代码

try( RevWalk walk = new RevWalk( git.getRepository() ) ) {
  RevCommit commit = walk.parseCommit( commitId );
  ObjectId treeId = commit.getTree().getId();
  try( ObjectReader reader = git.getRepository().newObjectReader() ) {
    return new CanonicalTreeParser( null, reader, tree );
  }
}

使用上面的代码,我得到了分支中存在的所有文件的列表。我需要在提交中删除,修改或添加的文件列表。

使用以下git命令,我成功获得了属于特定提交的文件列表

git diff-tree --name-only -r <commitId>

我想从JGit那里得到同样的东西。

更新:我不想得到两个提交之间的区别,而只是作为提交的一部分更改的文件列表。

共有1个答案

司浩壤
2023-03-14

您可以使用Git.diff()命令。它需要两个树迭代器:

    final List<DiffEntry> diffs = git.diff()
            .setOldTree(prepareTreeParser(repository, oldCommit))
            .setNewTree(prepareTreeParser(repository, newCommit))
            .call();

可以使用以下命令从commitId创建树迭代器:

    try (RevWalk walk = new RevWalk(repository)) {
        RevCommit commit = walk.parseCommit(repository.resolve(objectId));
        RevTree tree = walk.parseTree(commit.getTree().getId());

        CanonicalTreeParser treeParser = new CanonicalTreeParser();
        try (ObjectReader reader = repository.newObjectReader()) {
            treeParser.reset(reader, tree.getId());
        }

        walk.dispose();

        return treeParser;
    }

然后,您可以遍历生成的列表并检索每个更改/添加/删除文件的详细信息。

另请参阅我的jgit-cookbook中的此示例以获取可运行的展示。

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

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

  • 我有一个新克隆的存储库的SHA-1。我要这个SHA-1的作者缩进。 所以我需要使用RevWalk并迭代整个存储库?或者是否有 方法或其他代码可用于获取 或其他具有 PersonIdent 的对象? 我尝试了什么:

  • 问题内容: 不久前,我正在寻找Java中的可嵌入的分布式版本控制系统,我想我已经在JGit中找到了它,它是git的纯Java实现。但是,示例代码或教程的方式并不多。 如何使用JGit检索某个文件的HEAD版本(就像或应该做)? 我想这涉及一些rev-tree-walking,并且正在寻找代码示例。 问题答案: 不幸的是,Thilo的答案不适用于最新的JGit API。这是我找到的解决方案: 我希望

  • 我需要使用JGit获取与特定提交关联的分支的名称。我使用JGit获取存储库的提交SHA的完整列表,现在我需要知道它所属的分支的名称。 如果有人能让我知道我如何做到这一点,我将不胜感激。

  • 问题内容: 我在AWS Athena中创建了用于查询S3数据的外部表,但是位置路径中有1000多个文件。因此,我需要将记录的相应文件名显示为表中的一列。 简而言之,我需要了解AWS Athena Presto中等效的INPUT__FILE__NAME(hive)或任何其他实现此目的的方法。 问题答案: 您可以使用$ path伪列执行此操作。