如何找到 git 提交所在的分支? (使用 libgit2sharp)

How to find the branch a git commit is on? (Using libgit2sharp)

对于一个研究项目,我一直在尝试复制 SourceTree 或 Tortoise 等版本控制软件中的图形视图Git。

我正在尝试实现的图表视图

我遇到的最大问题是查找提交属于哪个分支。如果我有这个,我可以为提交点分配一列和一种颜色。这很困难,因为在幕后,Git 不存储提交最初所在的分支。

查看 Whosebug 上的其他解决方案,我发现可以获得包含提交的分支列表,但我需要一种方法来隔离单个分支以显示在我的图表中。以同样的方式,SourceTree 或 TortoiseGit 以某种方式设法做到了。

我的问题也和这个一模一样,Find out the branch a commit belongs to in LibGit2Sharp?

看起来他们在私人讨论室中发现了真正的解决方案。但是,我没有资格发表评论并询问他们发现了什么。

有人知道我该怎么做吗?

或者,@nulltoken 如果你偶然看到这个并记住,你知道你们在那个讨论室里发现了什么吗?

不确定这个答案对您有多大帮助。对“git branch --contains $SHA1”的 LibGit2Sharp 等效调用是 GitHub、an open one!

上请求的功能

很久以前,我使用了 query over all refs like this,但对于您的用例,它可能非常慢。

我正在尝试寻找可能的方法来缓解这个问题,但找不到任何指路明灯。 :( 然后我发现 this comment 断言您需要遍历 DAG 并验证具有提交的实际分支。这都暗示您需要采用慢速遍历所有引用方法。

结果生成图,SourceTree 不需要知道提交在哪个分支上。

图表中的第一个提交始终有一个列 0。此外,可以获得给定提交的父提交列表。通过从第一次提交开始并向后迭代,他们可以仅使用此信息生成一个漂亮的图表。

当您希望显示的不仅仅是 HEAD 的历史记录(通过枚举 repository.Commits 实现)时,这可能对如何执行此操作很有价值:

repository.Commits
    .QueryBy(new CommitFilter 
    {
        IncludeReachableFrom = repository.Refs.ToList(), // or adjust to your needs
        SortBy = CommitSortStrategies.Time
    })
    .Distinct<Commit>(EqualityComparer<GitObject>.Default)
    .ToList();

复制自/灵感来自:

迭代提交时,您检查哪些引用(包括分支)指向它们以在图表中显示引用名称。
我建议将引用存储在查找中以查找指向每个提交的引用:

ILookup<GitObject, string> refsByCommit = repo.Refs.ToLookup(@ref => @ref.ResolveToDirectReference().Target, @ref => @ref.CanonicalName);
// ( ... )
foreach (var commit in commits)
{
    // ( ... )
    var refNames = refsByCommit[commit];
    // ( ... )
}