【问题标题】:How to list commits in JGit with filepath如何在 JGit 中使用文件路径列出提交
【发布时间】:2018-06-09 15:08:32
【问题描述】:

我想用 Java 列出本地 Git 存储库的提交。所以我使用下面的代码来做到这一点:

Iterable<RevCommit> commits = git.log().all().call();

但我还需要提交并在 git log 中列出的每个文件的路径。

【问题讨论】:

  • 对于commits 中的每个提交,您可以按照本文所述列出文件:stackoverflow.com/questions/40590039/…
  • 我在下面的代码中的treeWalk.reset(rev.getId()); 线上收到了 IncorrectObjectTypeException。 Iterable&lt;RevCommit&gt; logs = git.log().call(); &lt;/br&gt; for (RevCommit rev : logs) { &lt;/br&gt;
  • 什么是rev?请编辑您的问题以包含您正在运行的完整 sn-p。

标签: jgit git-log


【解决方案1】:

解决方案对我有用:

ObjectReader or = repository.newObjectReader();
        RevWalk rw = new RevWalk(or);
        TreeWalk tw = new TreeWalk(or);
          tw.setFilter(TreeFilter.ANY_DIFF);
          tw.setRecursive(true);
          ObjectId start = repository.resolve(Constants.HEAD);
          startId = or.abbreviate(start);
          rw.markStart(rw.parseCommit(start));

          for(;;){
          RevCommit c = rw.next();
          if (c == null){
              break;
          }
          if (c.getParentCount() != 1){
              continue;
          }
          RevCommit p = c.getParent(0);
            rw.parseHeaders(p);
            tw.reset(p.getTree(), c.getTree());
            while (tw.next()) {
                System.out.println(tw.getPathString()+" id: "+c.getId());
            }
          }

【讨论】:

  • 很好的反馈,+1。
【解决方案2】:

关于IncorrectObjectTypeException,您确实有TreeWalk.reset() 抛出该异常,因为来自Javadoc:

给定的对象 id 并不表示树,而是命名了一些其他非树类型的对象。请注意,提交不是树,即使它们有时被称为“树状”。

请参阅those examples of TreeWalk.reset 以了解如何从给定的提交访问树。喜欢rev.getTree()

【讨论】:

  • 示例链接帮助了我。谢谢
  • @RujutaS 太好了!很高兴能帮上忙。
猜你喜欢
  • 2017-03-28
  • 1970-01-01
  • 2015-05-01
  • 2017-12-09
  • 2014-05-21
  • 2018-12-11
  • 2015-01-24
  • 2021-05-22
  • 2018-04-15
相关资源
最近更新 更多