是否有一种简单的方法可以找到给定提交的所有引用(例如标记)? 例如:
using( Repository repo = new Repository( path_to_repo ) )
{
foreach( Commit commit in repo.Commits )
{
List<Reference> assignedRefs = commit.Refs; // <- how to do this?
}
}
答案 0 :(得分:1)
下面的代码检索可以到达所选提交的所有引用。
using( Repository repo = new Repository( path_to_repo ) )
{
foreach( Commit commit in repo.Commits )
{
IEnumerable<Reference> refs =
repo.Refs.ReachableFrom(new[] { commit });
}
}
如果您只想检索Tag
,该方法会公开一个重载来帮助您解决此问题。
using( Repository repo = new Repository( path_to_repo ) )
{
var allTags = repo.Refs.Where(r => r.IsTag()).ToList();
foreach( Commit commit in repo.Commits )
{
IEnumerable<Reference> refs =
repo.Refs.ReachableFrom(allTags, new[] { commit });
}
}
注意:此代码将检索直接指向所选提交或指向此提交的祖先的所有引用。从这个意义上说,它的行为类似于 git rev-list 命令。
答案 1 :(得分:0)
正如@ user1130329所指出的,多次遍历所有引用可能非常昂贵。作为替代方案,这是我在类似情况下所做的:
logs = _repo.Commits
.QueryBy(filter)
.Select(c => new LogEntry
{
Id = c.Id.Sha,
// other fields
})
.ToList();
var logsDictionary = logs.ToDictionary(d => d.Id);
_repo.Refs
.Where(r => r.IsTag || r.IsLocalBranch)
.ForEach(r =>
{
if (r.IsTag) logsDictionary.GetValueOrDefault(r.TargetIdentifier)?.Tags.Add(r.CanonicalName);
if (r.IsLocalBranch) logsDictionary.GetValueOrDefault(r.TargetIdentifier)?.Heads.Add(r.CanonicalName);
});