-->

如何轻松搞定所有参考文献为指定的提交?(How to easily get all Refs for

2019-11-03 02:08发布

有没有一种简单的方法来找到一个给定提交的所有引用(如标签)? 例如:

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

Answer 1:

下面的代码检索,可以达到所选提交的所有引用。

using( Repository repo = new Repository( path_to_repo ) )
{
    foreach( Commit commit in repo.Commits )
    {
        IEnumerable<Reference> refs =
               repo.Refs.ReachableFrom(new[] { commit });
    }
}

如果你想只检索Tag S,该方法公开过载,以帮助您与此有关。

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的转速名单命令。



Answer 2:

正如@ 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);
    });


文章来源: How to easily get all Refs for a given Commit?