您知道查找包含某些提交的最近标记的合理方法是什么吗?
git describe --contains my-commit-hash
工作得很好,但我没有看到LibGit2Sharp
的方法。我想做一些类似
的事情foreach (var childCommit in GetChildrenOrSelf(commit))
{
var tag = repo.Tags[childCommit];
if (tag != null)
return tag;
}
但是我找不到一个简单的方法来实现GetChildrenOrSelf
根据这个如何找到所有提交有一个特定的父?-这不是一个简单的任务。
你能给点建议吗?
Git description在libgit2中是一个正在进行的工作。您可以订阅libgit2/libgit2#1066以获取有关其未来进展的通知。
虽然这只是实现目标的第一步,但您可以从repo.Refs.ReachableFrom()
方法中获得一些帮助。它检索所有能够达到特定Commit
s集合的Reference
s。
测试首先描述了如何利用这个方法。其中一个甚至强调了如何只检索标签。
var result = repo.Refs.ReachableFrom(
repo.Refs.Where(r => r.IsTag()),
new[] { repo.Lookup<Commit>(myCommitHash) });
现在,为了确定"最接近"的标签,您必须在这些标签中找到与目标提交之间的提交数量最少的标签。下面的方法应该做到这一点:
private Reference Closest(IRepository repo,
IEnumerable<Reference> result, Commit commit)
{
int max = int.MaxValue;
Reference cl = null;
var f = new CommitFilter { Until = commit.Id };
foreach (var reference in result)
{
f.Since = reference;
var c = repo.Commits.QueryBy(f).Count();
if (c >= max)
{
continue;
}
max = c;
cl = reference;
}
return cl;
}
注1:根据您的标记命名方案,您可能能够跳过这最后一个阶段(通过选择最老的标记而不执行任何计数,例如:v0.17
比v0.21
更有可能"更接近"提交)。
注2:此方法不是最有效的方法,因为它将执行大量的revwalk。但是,在git-describe在libgit2中原生实现之前,它应该会对您有所帮助。