有没有一种简单的方法来找到一个给定提交的所有引用(如标签)? 例如:
using( Repository repo = new Repository( path_to_repo ) )
{
foreach( Commit commit in repo.Commits )
{
List<Reference> assignedRefs = commit.Refs; // <- how to do this?
}
}
有没有一种简单的方法来找到一个给定提交的所有引用(如标签)? 例如:
using( Repository repo = new Repository( path_to_repo ) )
{
foreach( Commit commit in repo.Commits )
{
List<Reference> assignedRefs = commit.Refs; // <- how to do this?
}
}
下面的代码检索,可以达到所选提交的所有引用。
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的转速名单命令。
正如@ 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);
});