libGit2Sharp等效于git describe --contains

时间:2014-03-18 01:19:08

标签: git libgit2sharp

您是否知道找到包含特定提交的最近标记的合理方法是什么?

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? - 这不是一项简单的任务。

你能提出什么建议吗?

1 个答案:

答案 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中本地实现。

相关问题