LibGit2Sharp等价于git描述——包含



您知道查找包含某些提交的最近标记的合理方法是什么吗?

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.17v0.21更有可能"更接近"提交)。

注2:此方法不是最有效的方法,因为它将执行大量的revwalk。但是,在git-describe在libgit2中原生实现之前,它应该会对您有所帮助。

最新更新