如何找到 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];
// ( ... )
}
对于一个研究项目,我一直在尝试复制 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];
// ( ... )
}