对于一个研究项目,我一直在尝试复制SourceTree或TortoiseGit等版本控制软件中的图表视图。
我正在尝试实现的图表视图
我遇到的最大问题是找到提交所属的分支。如果我有这个,我可以为提交点分配一列和一个颜色。这很困难,因为在引擎盖下,Git不存储最初提交的分支。
在StackOverflow上查看其他解决方案,我发现可以获得包含提交的分支列表,但我需要一种隔离单个方法以在我的图形中显示的方法。以同样的方式,SourceTree或TortoiseGit以某种方式设法做到了。
我的问题也与此问题相同,Find out the branch a commit belongs to in LibGit2Sharp?
看起来他们在私人讨论室中发现了实际的解决方案。但是,我没有评论和询问他们发现了什么的声誉。
有没有人对如何做到这一点有任何想法?
或者,@ nulltoken如果你偶然看到这个并记住,你知道你们在那个讨论室里发现了什么吗?
答案 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];
// ( ... )
}