17.2.3 带签名的里程碑

带签名的里程碑和上面介绍的带说明的里程碑本质上是一样的,都是在创建里程碑的时候在Git对象库中生成一个tag对象,只不过带签名的里程碑多做了一个工作:为里程碑对象添加GnuPG签名。

创建带签名的里程碑也非常简单,使用参数-s或-u<key-id>即可。还可以使用-m<msg>参数直接在命令行中提供里程碑的描述。创建带签名的里程碑的一个前提是需要安装GnuPG,并且建立相应的公钥/私钥对。

GnuPG可以在各个平台上安装。

在Linux如Debian/Ubuntu上安装,执行:


$sudo aptitude install gnupg


在Mac OS X上可以通过Homebrew安装:


$brew install gnupg


在Windows上可以通过cygwin安装gnupg。

为了演示创建带签名的里程碑,还是事先创建一个空提交:


$git commit—allow-empty-m "blank commit for GnuPG-signed tag test." [master ebcf6d6]blank commit for GnuPG-signed tag test.


直接在刚刚创建的空提交上创建一个带签名的里程碑mytag3很可能会失败:


$git tag-s-m "My frst GPG-signed tag." mytag3

gpg:"user1<user1@sun.ossxp.com>"已跳过:私钥不可用

gpg:signing failed:私钥不可用

error:gpg failed to sign the tag

error:unable to sign the tag


之所以签名失败,是因为找不到签名可用的公钥/私钥对。使用下面的命令可以查看当前可用的GnuPG公钥。


$gpg—list-keys

/home/jiangxin/.gnupg/pubring.gpg


pub 1024D/FBC49D01 2006-12-21[有效至:2016-12-18]

uid Jiang Xin<worldhello.net@gmail.com>

uid Jiang Xin<jiangxin@ossxp.com>

sub 2048g/448713EB 2006-12-21[有效至:2016-12-18]


可以看到GnuPG的公钥链(pubring)中只包含了Jiang Xin用户的公钥,尚没有uesr1用户的公钥。

实际上在创建带签名的里程碑时,并非一定要使用签名者本人的公钥/私钥对进行签名,使用-u<key-id>参数调用就可以用指定的公钥/私钥对进行签名,对于此例可以使用FBC49D01作为<key-id>。但如果没有可用的公钥/私钥对,或者希望使用提交者本人的公钥/私钥对进行签名,就需要为提交者:user1<user1@sun.ossxp.com>创建对应的公钥/私钥对。

使用命令gpg—gen-key来创建公钥/私钥对。


$gpg—gen-key


按照提示一步一步操作即可。需要注意的有:

在创建公钥/私钥对时,会提示输入用户名,输入User1,提示输入邮件地址,输入user1@sun.ossxp.com,其他可以采用默认值。

在提示输入密码时,为了简单起见可以直接按下回车,即使用空口令。

在生成公钥/私钥对过程中,会提示用户做一些随机操作以便产生更好的随机数,这时不停的晃动鼠标就可以了。

创建完毕,再查看一下公钥链。


$gpg—list-keys

/home/jiangxin/.gnupg/pubring.gpg


pub 1024D/FBC49D01 2006-12-21[有效至:2016-12-18]

uid Jiang Xin<worldhello.net@gmail.com>

uid Jiang Xin<jiangxin@ossxp.com>

sub 2048g/448713EB 2006-12-21[有效至:2016-12-18]

pub 2048R/37379C67 2011-01-02

uid User1<user1@sun.ossxp.com>

sub 2048R/2FCFB3E2 2011-01-02


很显然用户user1的公钥/私钥对已经建立。现在就可以直接使用-s参数来创建带签名的里程碑了。


$git tag-s-m "My frst GPG-signed tag." mytag3


查看里程碑,可以看到该里程碑已经创建。


$git tag-l my*-n1

mytag blank commit.

mytag2 My first annotated tag.

mytag3 My first GPG-signed tag.


和带说明的里程碑一样,在Git对象库中也建立了一个tag对象。查看该tag对象可以看到其中包含了GnuPG签名。


$git cat-file tag mytag3

object ebcf6d6b06545331df156687ca2940800a3c599d

type commit

tag mytag3

tagger user1<user1@sun.ossxp.com>1293960936+0800

My first GPG-signed tag.

——-BEGIN PGP SIGNATURE——-

Version:GnuPG v1.4.10(GNU/Linux)

iQEcBAABAgAGBQJNIEboAAoJEO9W1fg3N5xn42gH/jFDEKobqlupNKFvmkI1t9d6

lApDFUdcFMPWvxo/eq8VjcQyRcb1X1bGJj+pxXk455fDL1NWonaJa6HE6RLu868x

CQIWqWelkCelfm05GE9FnPd2SmJsiDkTPZzINya1HylF5ZbrExH506JyCFk//FC2

8zRApSbrsj3yAWMStW0fGqHKLuYq+sdepzGnnFnhhzkJhusMHUkTIfpLwaprhMsm

1IIxKNm9i0Zf/tzq4a/R0N8NiFHl/9M95iV200I9PuuRWedV0tEPS6Onax2yT3JE

I/w9gtIBOeb5uAz2Xrt5AUwt9JJTk5mmv2HBqWCq5wefxs/ub26iPmef35PwAgA=

=jdrN

——-END PGP SIGNATURE——-


要验证签名的有效性,如果直接使用gpg命令会比较麻烦,因为需要将这个文件拆分为两个,一个是不包含签名的里程碑内容,另外一个是签名本身。还好可以使用命令git tag-v来验证里程碑签名的有效性。


$git tag-v mytag3

object ebcf6d6b06545331df156687ca2940800a3c599d

type commit

tag mytag3

tagger user1<user1@sun.ossxp.com>1293960936+0800

My first GPG-signed tag.

gpg:于2011年01月02日星期日17时35分36秒CST创建的签名,使用RSA,钥匙号37379C67