如何使用JGit找到一个分支的第一个提交?

4

我想使用Eclipse的JGit库查找特定分支的第一个提交。例如,如果我有

master -- a -- c -- d -- e
          \
  feature  b -- f -- g -- h
            \
    another  j -- k -- l


// findBranchRoot() is the magic method we want to create
repository.resolve("feature").findBranchRoot().getId(); // this would return b
repository.resolve("another").findBranchRoot().getId(); // this would return j

有人知道怎么做吗?

2个回答

3

你将要遇到的问题是,提交记录并不“在”分支上。请耐心听我解释。想象一下你画的那张图。它是模棱两可的,不可避免地如此。你画的

A---C---D---E          master
 \
  B---F---G---H        feature
   \
    J---k---L          another

无法确定 B 是基于 feature 还是 another 创建的(或者说,无法确定其中哪个 A 是基于此创建的)。

A---C---D---E          master
 \
  B---J---K---L        another
   \
    F---G---H          feature

展示了完全相同的历史记录。它完全取决于您选择如何解释它。

如果您想将提交与某些外部管理记录相关联,请在提交消息中放置一个标记,这样就可以了,但在Git本身(以及实际工作)中,重要的是历史结构,而不是在该存储库或其他存储库中引用其中某些部分的方式。

如果到了发布“feature”或“another”的时候,无论如何都需要推送提交“B”,除非它已作为其他工作的一部分被推送。祖先很重要,分支名称不重要。


哦,好的,这很有道理。谢谢你抽出时间来回答 :) - TheCrafter

0
如果“第一次提交”表示分支的最近/最年轻的提交,您可以使用由“Repository::resolve”返回的“ObjectId”来获取具有“RevWalk”的“RevCommit”(JGit表示提交对象):
ObjectId commitId = repository.resolve("refs/heads/feature");
try(RevWalk revWalk = new RevWalk(repository)) {
  RevCommit commit = revWalk.parseCommit(commitId);
}

我建议向 `resolve` 传递完全限定的引用(就像示例中一样)。否则,你很可能会得到一个 `AmbiguousObjectException` 异常或者该方法返回相同短名称的注释或标签。

不,我的意思是提交到该分支的第一个提交。这个分支的起点/根源。 - TheCrafter
1
啊,我看错了“提交图”,我会相应更新我的答案。 - Rüdiger Herrmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接