0

当前状态下 git 存储库的状态有一个 sha 值表示吗?

如果 git 具有此 sha 值,则每次对象数据库更新和引用更改时要更新的 sha 值。

换句话说,sha 值代表整个存储库的当前版本。

这是我计算当前引用的 sha 的代码。有 git 级别的 API 或接口吗?

private string CalcBranchesSha(bool includeTags = false)
{
    var sb = new StringBuilder();
    sb.Append(":HEAD");
    if (_repository.Head.Tip != null)
        sb.Append(_repository.Head.Tip.Sha);
    sb.Append(';');
    foreach (var branch in _repository.Branches.OrderBy(s => s.Name))
    {
        sb.Append(':');
        sb.Append(branch.Name);
        if (branch.Tip != null)
            sb.Append(branch.Tip.Sha);
    }
    sb.Append(';');
    if (includeTags)
    {
        foreach (var tag in _repository.Tags.OrderBy(s => s.Name))
        {
            sb.Append(':');
            sb.Append(tag.Name);
            if (tag.Target != null)
                sb.Append(tag.Target.Sha);
        }
    }
    return sb.ToString().CalcSha();
}
4

1 回答 1

1

当前状态下 git 存储库的状态有一个 sha 值表示吗?

用 git 的说法,存储库的状态通常是指工作目录、索引和当前 HEAD 提交之间存在差异的路径。

但是,看起来您并不在此之后。据我了解,您正在尝试计算代表当前存储库状态的校验和(即您的分支和标签指向的内容)。

关于代码,可能会在某些方面进行改进以获得更精确的校验和:

  • 考虑存储库中的所有引用(除了refs/tagsrefs/heads)(想想refs/stash,或者在重写存储库历史时refs/notes生成的备份引用)。refs/original
  • 考虑从直接引用中消除符号的歧义。(即:HEAD->master->08a4217应该导致与 不同的校验和HEAD->08a4127

下面是通过利用命名空间处理上述两点的代码的修改版本Refs

private string CalculateRepositoryStateSha(IRepository repo)
{
    var sb = new StringBuilder();

    sb.Append(":HEAD");
    sb.Append(repo.Refs.Head.TargetIdentifier);
    sb.Append(';');

    foreach (var reference in repo.Refs.OrderBy(r => r.CanonicalName))
    {
        sb.Append(':');
        sb.Append(reference.CanonicalName);
        sb.Append(reference.TargetIdentifier);
        sb.Append(';');
    }

    return sb.ToString().CalcSha();
}

请记住以下限制:

  • 这不考虑对索引或工作目录的更改(例如,无论文件是否已暂存,都将返回相同的校验和)
  • 有一些方法可以在不修改引用的情况下在对象数据库中创建对象。这些更改不会反映在上面的代码中。一种可能的 hack-ish 方法是还附加到StringBuuilder, 对象数据库中的对象数量(即repo.ObjectDatabase.Count()),但这可能会妨碍整体性能,因为这将在每次计算校验和时枚举所有对象)。

有 git 级别的 API 或接口吗?

我不知道 git 中有任何等效的本机函数(尽管可以通过一些脚本实现类似的结果)。libgit2 或 Libgit2Sharp API 中没有原生的东西。

于 2014-01-09T19:38:21.657 回答