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

Posted

技术标签:

【中文标题】如何使用 JGit 找到提交的分支?【英文标题】:How to find the branch for a commit with JGit? 【发布时间】:2018-04-15 15:56:57 【问题描述】:

我需要使用 JGit 获取与特定提交关联的分支的名称。我使用 JGit 获取存储库的提交 SHA 的完整列表,现在我需要知道它所属的分支的名称。

如果有人可以让我知道如何实现这一点,不胜感激。

【问题讨论】:

仅提及分支的提示(最近提交)实际上与分支“关联”。对于其他提交,您只能通过查看提交图表和历史来猜测。 【参考方案1】:

在 Git 中,提交不属于分支。提交是不可变的,而分支可以更改其名称以及它们指向的提交。

如果有一个分支直接指向该提交或该提交的后续分支,则该提交是可访问的。

在 JGit 中,NameRevCommand 可用于查找直接指向提交的分支(如果有)。例如:

Map<ObjectId, String> map = git
  .nameRev()
  .addPrefix("refs/heads")
  .add(ObjectId.fromString("<SHA-1>"))
  .call();

上面的 sn-p 在 refs/heads 命名空间中查找指向给定提交的 ref。返回的映射最多包含一个条目,其中键是给定的提交 id,值表示指向它的分支。

【讨论】:

给定地图为空时是什么意思(刚刚遇到需要“master”的问题 似乎没有找到指向add 给出的提交ID 的引用。原生 Git 会返回一些东西吗? 没有检查(因为它是临时存储库,仅获取单个分支)。我怀疑这与我实际上正在使用 fetch_head 的事实有关 - 例如。我不得不使用“additionalRefs”来使log 工作,因为refs 在存储库数据库中是空的。如果我使用.all() 获取,则会找到分支名称(无需使用additionalRefs 您可以尝试将addRefRef 一起用于FETCH_HEAD 以让命令考虑它。【参考方案2】:

正如document 所说,

类列表分支命令

ListBranchCommand setContains(String containsCommitish)

setContains

public ListBranchCommand setContains(String containsCommitish)

If this is set, only the branches that contain the specified commit-ish as an ancestor are returned.

Parameters:
containsCommitish - a commit ID or ref name

Returns:
this instance

Since:
3.4

这个api对应git branch --contains &lt;commit-ish&gt;

如果您想列出远程分支 (-r) 或同时列出远程和本地分支 (-a),您可能还需要此 api,

setListMode

public ListBranchCommand setListMode(ListBranchCommand.ListMode listMode)

Parameters:
listMode - optional: corresponds to the -r/-a options; by default, only local branches will be listed

Returns:
this instance

示例:

#list all the branches that "HEAD" belongs to.
try 
    Git git = Git.open(new File("D:/foo/.git"));
    List<Ref> refs = git.branchList().setContains("HEAD").setListMode(ListBranchCommand.ListMode.ALL).call();
    System.out.println(refs);
 catch (Exception e) 
    System.out.println(e);

【讨论】:

以上是关于如何使用 JGit 找到提交的分支?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不知道 JGit 本地是不是存在的情况下签出远程分支?

如何使用 jgit 查找所有提交,而不仅仅是可引用的提交

如何在 JGit 中从一个 git 分支硬重置到另一个分支?

如何列出存储库中的所有提交及其父信息以及使用命令行或 JGit 添加和删除的行?

如何在 JGit 中合并?

使用 jgit 创建远程和本地分支