【发布时间】:2018-02-24 21:56:56
【问题描述】:
我正在尝试手动获取 GIT 提交的 SHA1 提交哈希,但有些东西无法正常工作。
首先,我们有如下所示的标准提交消息:
tree f594b3f6d9ae291c83902f3992aa36872aa70d68
parent 0000004bf6d464667df5150b4526083886947d92
author User <foo@bar.com> 1390620460.46263 +0000
committer User <foo@bar.com> 1390620460.46263 +0000
Commit Message
我们称之为“commitMessage”
规范说要获得提交哈希,我们必须 sha1:
- 字符串“提交”
- 加一个空格“”
- 加上 commitMessage 中的字节数
- 加上一个空字节
- 加上commitMessage
so(伪代码obv)
SHA1( "commit" + " " + numBytes(commitMessage) + '\0' + commitMessage );
这是我在 C# 中的实现 (我知道这很笨重)
var commitBody = "tree " + treeHash + "\n\n" +
"parent " + parentHash + "\n\n" +
"author User <foo@bar.com> " + date + "\n" +
"committer User <foo@bar.com> " + date + "\n\n" +
"My Commit Message\n";
var blob = "commit " + Encoding.UTF8.GetByteCount(commitBody);
// This is the string "commit " (with a space) + byte count
var first = Encoding.UTF8.GetBytes(blob);
// This is just the null byte
var second = new byte[1];
second[0] = (byte)0;
// This is the commitMessage
var third = Encoding.UTF8.GetBytes(commitBody);
// Merge first, second, third into bytez as a byte array
var bytez = new byte[first.Length + second.Length + third.Length];
Buffer.BlockCopy(first, 0, bytez, 0, first.Length);
Buffer.BlockCopy(second, 0, bytez, first.Length, second.Length);
Buffer.BlockCopy(third, 0, bytez, first.Length + second.Length, third.Length);
// Debug Print
Console.WriteLine(Encoding.UTF8.GetString(bytez));
// Compute the hash and print it
var sss = SHA1.Create();
var myssh = GetString(sss.ComputeHash(bytez));
Console.WriteLine(myssh);
返回的哈希值与从 GIT 返回的不同。我实际上并不指望任何人知道如何做到这一点,因为这不是通常会做的事情,但我想我会问。
感谢您的帮助:D
【问题讨论】: