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

时间:2017-11-14 03:04:09

标签: git libgit2sharp

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

我正在尝试实现的图表视图 The graph view I'm trying to implement

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

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

我的问题也与此问题相同,Find out the branch a commit belongs to in LibGit2Sharp?

看起来他们在私人讨论室中发现了实际的解决方案。但是,我没有评论和询问他们发现了什么的声誉。

有没有人对如何做到这一点有任何想法?

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

3 个答案:

答案 0 :(得分:2)

不确定这个答案对您有多大帮助。对于“git branch --contains $SHA1”的LibGit2Sharp等效调用是GitHub上的请求功能,an open one

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

我试图想出可能的方法来缓解这个问题,无法提出任何指路明灯。 :(然后我发现this comment断言您需要遍历DAG并验证具有提交的实际分支。这一切都暗示您需要采用慢速遍历全部参考方法。

答案 1 :(得分:0)

结果是生成图表,SourceTree不需要知道提交的分支。

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

答案 2 :(得分: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();

复制自/灵感来自: https://stackoverflow.com/a/68564141/2240196

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

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