如何轻松获得给定提交的所有参考?

时间:2014-03-21 06:51:48

标签: libgit2sharp

是否有一种简单的方法可以找到给定提交的所有引用(例如标记)? 例如:

using( Repository repo = new Repository( path_to_repo ) )
{
    foreach( Commit commit in repo.Commits )
    {
        List<Reference> assignedRefs = commit.Refs; // <- how to do this?
    }
}

2 个答案:

答案 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);
    });