我正在GitHub工作流程中通过API创建签名提交,因此我刚刚阅读了文档https://developer.github.com/v3/git/commits/#create-a-commit
我正在使用示例数据树创建有效负载文件
827efc6d56897b048c772eb4087f854f46256132 parent
7d1b31e74ee336d15cbd21741bc88a537ed063a0 author Mona Octocat
<octocat@github.com> 1215576810 +1200 committer Mona Octocat
<octocat@github.com> 1215576810 +1200
my commit message
但我在签名提交中得到无效,我想知道通过API进行签名提交实际上需要什么,因为我无法找到任何博客或帖子。
1条答案
按热度按时间bhmjp9jg1#
首先,你应该试着理解Git commit是如何签名的。
要保存一些文本,请参考What data is being signed when you
git commit --gpg-sign=<key-id>
?以了解签名数据的详细信息--我在这里只会复制它。显然你不会有GitHub的私钥,所以你必须带上自己的密钥。在GitHub settings中上传它,这样它就成为“受信任的”了。首先,在本地执行待签名的提交,这样你就有了提交数据。例如,我在写这个答案的时候使用的是我的仓库的the
HEAD
commit:从Git中提取GPG签名的有效载荷(消息部分)。你需要去掉尾部的换行符(就像我对
perl
所做的那样)。现在我在
commit
文件中有了消息有效负载。我想用我自己的密钥创建一个签名。因为Git需要一个SHA-1的签名算法,我为CLI调用提供了
--digest-algo SHA1
。我还添加了--clear-sign
(仅签名,不包括消息正文)和--armor
(输出ASCII装甲格式)上述命令生成了包含以下内容的文件
commit.asc
:这是您希望在
signature
JSON字段中使用的签名,如GitHub文档所示。构造API有效负载JSON:
发送到GitHub API:
请参见响应(截断):
在GitHub网站上查看the commit(archive)的实际应用!
很明显,以上所有步骤都可以用你喜欢的工具链来完成,你甚至不需要执行
git commit
。例如,手动构造的Git对象如下所示,没有尾随的换行符:在文件上使用
git hash-object -t commit
,将重新生成相同的提交SHA。正在尝试将此精心编制的提交对象存储到Git数据库中。
在前面加上对象类型标头:
获取完整对象的哈希值:
为对象创建目录:
使用zlib(
.zz
)算法压缩对象并保存对象:尝试Git是否识别此特制对象: