有一个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();
}
答案 0 :(得分:1)
有一个sha值表示当前状态下git存储库的状态吗?
用git的说法,存储库的状态通常是指工作目录,索引和当前HEAD提交之间存在差异的路径。
然而,看起来你不像是在这之后。根据我的理解,您正在尝试计算代表当前存储库状态的校验和(即您的分支和标记指向的内容)。
关于代码,可以通过某些方式对其进行改进,以获得更精确的校验和:
refs/tags
和refs/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();
}
请注意以下限制:
StringBuuilder
,对象数据库中的对象数量(即repo.ObjectDatabase.Count()
),但这可能会妨碍整体性能,因为这将每次计算校验和时枚举所有对象。)有一个git级API或接口吗?
我不知道git中有任何等效的本机函数(虽然通过一些脚本可以实现类似的结果)。 libgit2或Libgit2Sharp API中没有本机。