【问题标题】:LibGit2Sharp equivalent for git describe --containsgit describe --contains 的 LibGit2Sharp 等效项
【发布时间】:2014-03-18 01:19:07
【问题描述】:

你知道找到包含某个提交的最近标记的合理方法是什么吗?

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

你有什么建议吗?

【问题讨论】:

  • 您正在询问包含您的提交的标签,该答案将 all 提交作为候选。标签列表要短得多,并且会有一个 API 调用。从那里向后搜索。因为合并会导致拆分路径向后移动,所以您需要维护一个提交队列,您接下来要测试其父级的提交,将父级添加到队列中,然后从一开始就以最少的步骤将提交出列。排队的项目应该知道它们的原始标签,以便在您达到目标时读取。这只是带有单位重量的en.wikipedia.org/wiki/Dijkstra's_algorithm
  • @bazzargh 我们正在使用标签来自动设置 TeamCity 的构建版本。目前我们有 9955 个标签。无论如何,我认为遍历所有标签并不是一个好主意,这很慢
  • 您可以立即消除任何指向早于目标提交的标签,并按日期顺序尝试标签。这将为您提供与上述不同的答案(时间最接近,而不是提交计数最接近)。在这种情况下,过多的标签是一种帮助,因为它将时间分成更小的块,因此要搜索的提交更少。

标签: git libgit2sharp


【解决方案1】:

Git describe 是 libgit2 中正在进行的一项工作。您可以订阅 issue libgit2/libgit2#1066 以获取有关其未来进展的通知。

虽然这只是实现目标的第一步,但您可能会从repo.Refs.ReachableFrom() 方法中获得一些帮助。它检索所有可以到达一组特定Commits 的References。

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: 这种方法不是最有效的方法,因为它会执行大量的 revwalk。但是,在 git-describe 在 libgit2 中本地实现之前,它应该会对您有所帮助。

【讨论】:

    猜你喜欢
    • 2017-09-05
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2015-04-14
    • 2023-03-15
    • 2019-07-16
    • 2011-03-20
    相关资源
    最近更新 更多