java - 如何在 jgit 中调用 git show --first-parent?

标签 java git jgit

我需要从 master 获取非 merge 类型且不来自其他分支的提交(它们直接放在 master 上)。 git命令是

git log --no-merges --first-parent

我如何使用 JGit 执行此操作? 我设法使用

获得了非 merge 类型的提交
RevFilter.NO_MERGES

但是我怎样才能得到直接提交到 master 分支的提交呢?

最佳答案

要获得第一个 parent ,您可以调用 RevCommit.getParent()并从那里开始工作。

不使用 RevWalk 的理由用于访问树的是 RevWalk 在不遵循层次结构的情况下遍历 revs——也就是说,如果你没有阅读提交,它的父级将被读取——这不是 - -first-parent 所做的,以及我们在这里想要的。

所以 Rüdiger Herrmann's answer将无法删除在 (n+1,...)th 分支上所做的提交。它只会删除在这些分支上所做的第一次提交。

代码

Repository repo = git.getRepository();
try (RevWalk walk = new RevWalk(repo)) {
    RevCommit head = walk.parseCommit(repo.getRef(MASTER).getObjectId());
    int count = 0;
    while (head != null) {
        count++;
        RevCommit[] parents = head.getParents();
        if (parents != null && parents.length > 0) {
            head = walk.parseCommit(parents[0]);
        } else {
            head = null;
        }
    }
    return count;
}

这是从 groovy source 转换而来的

注意事项

  1. 调用 walk.parseCommit(parents[0]) 是必需的,因为 .getParents() 返回的提交将不会被完全解析,并且会给出 null 对自己调用 .getParents()
  2. 这是为了从基于我的另一个 answer 的 Android 构建脚本 (gradle) 的 git repo 中查找版本代码而编写的。 . (参见 source)

关于java - 如何在 jgit 中调用 git show --first-parent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33038224/

相关文章:

Java 协作泛型类 : can we avoid unchecked cast?

git - 仅 merge git 分支中的增量更改

当项目包含其他子模块时,git filter-branch 不工作

java - 从远程 git 存储库获取单个文件

java - JGit 中的 merge 基础是如何完成的?

java - Android手写识别库

java - 为什么抛出异常的方法的调用者在这种情况下不必处理异常?

支持 DOM 样式访问的 Java JSON 库

git - Jenkins,通过 ssh 与多个用户获取 git 子模块?

java - 你如何为 jgit 设置 jschconfigsessionfactory 的配置,以便 pull 和 push 工作?