您是否知道找到包含特定提交的最近标记的合理方法是什么?
git describe --contains my-commit-hash
工作正常,但我没有办法用LibGit2Sharp做同样的事情
我试图做像
这样的事情foreach (var childCommit in GetChildrenOrSelf(commit))
{
var tag = repo.Tags[childCommit];
if (tag != null)
return tag;
}
但我找不到一种简单的方法来实施 GetChildrenOrSelf
根据这个How to find all commits having a particular parent? - 这不是一项简单的任务。
你能提出什么建议吗?
答案 0 :(得分:1)
Git describe是libgit2中正在进行的工作。您可以订阅 libgit2/libgit2#1066 以获取有关其未来进展的通知。
虽然这只是实现目标的第一步,但您可以从repo.Refs.ReachableFrom()
方法获得一些帮助。它会检索可以到达一组特定Reference
s的所有Commit
。
tests 首先介绍如何利用此方法。其中一个甚至强调了如何只检索标签。
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:此方法不是最有效的方法,因为它会执行大量的revwank。但是,它应该可以帮到你,直到git-describe在libgit2中本地实现。