sha值表示git存储库的状态

时间:2014-01-09 17:28:43

标签: libgit2 libgit2sharp

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

每次更新对象数据库时要更新的sha值,如果git具有此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();
}

1 个答案:

答案 0 :(得分:1)

  

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

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

然而,看起来你不像是在这之后。根据我的理解,您正在尝试计算代表当前存储库状态的校验和(即您的分支和标记指向的内容)。

关于代码,可以通过某些方式对其进行改进,以获得更精确的校验和:

  • 说明存储库中的所有引用(refs/tagsrefs/heads旁边)(请refs/stashrefs/notesrefs/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();
}

请注意以下限制:

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

有一个git级API或接口吗?

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