GPG签名的Git tag

最近在学廖老师的GIT:

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。

Git有commit,为什么还要引入tag?

“请把上周一的那个版本打包发布,commit号是6a5819e...”

“一串乱七八糟的数字不好找!”

如果换一个办法:

“请把上周一的那个版本打包发布,版本号是v1.2”

“好的,按照tag v1.2查找commit就行!”

所以,tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。```
签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错:

gpg: signing failed: secret key not available
error: gpg failed to sign the data
error: unable to sign the tag```
如果报错,请参考GnuPG帮助文档配置Key:
GPG是加密软件,可以使用GPG生成的公钥在网上安全的传播你的文件、代码。

为什么说安全的?以Google所开发的repo为例,repo即采用GPG验证的方式,每个里程碑tag都带有GPG加密验证,假如在里程碑v1.12.3处你想要做修改,修改完后将这个tag删除,然后又创建同名tag指向你的修改点,这必然是可以的。但是,在你再次clone你修改后的项目时,你会发现,你对此里程碑tag的改变不被认可,验证失败,导致你的修改在这里无法正常实现。这就是GPG验证的作用,这样就能够保证项目作者(私钥持有者)所制定的里程碑别人将无法修改。那么,就可以说,作者的代码是安全传播的。

为什么会有这种需求?一个项目从开发到发布,再到后期的更新迭代,一定会存在若干的稳定版本与开发版本(存在不稳定因素)。作为项目发起者、持有者,有权定义他(们)所认可的稳定版本,这个稳定版本,将不允许其他开发者进行改动。还以Google的repo项目为例,项目所有者定义项目开发过程中的点A为稳定版v1.12.3,那么用户在下载v1.12.3版本后,使用的肯定是A点所生成的项目、产品,就算其他开发者能够在本地对v1.12.3进行重新指定,指定到他们修改后的B点,但是最终修改后的版本给用户用的时候,会出现GPG签名验证不通过的问题,也就是说这样的修改是不生效的。

可能还是不太好理解,说一个我曾经遇过的坑,repo在某个版本有个小错误,我在这个版本修复错误后,提交到内网的服务器给同事用(我重新定义这个版本的指向),最后发现同事在更新项目后,出现版本GPG签名验证错误,不能正常使用。

说了这么多,希望大家能够理解GPG签名验证的意义所在。下边就说一说,如何在你的项目中使用这种方式。

生成GPG Key
gpg --gen-key 然后根据提示选择你要的签名

gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

请选择您要使用的密钥种类:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (仅用于签名)
   (4) RSA (仅用于签名)
您的选择?  >选择加密种类

RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)

请设定这把密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) >选择密钥有效期```

对以上信息进行确认,然后输入身份,最终确认,等待生成GPG Key。

您需要一个用户标识来辨识您的密钥;本软件会用真实姓名、注释和电子邮件地址组合
成用户标识,如下所示:
“Heinrich Heine (Der Dichter) heinrichh@duesseldorf.de

真实姓名: Keven Liu
电子邮件地址: airk908@gmail.com
注释: GPG key for Keven
您选定了这个用户标识:
“Keven Liu (GPG key for Keven) airk908@gmail.com

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? O
您需要一个密码来保护您的私钥。

我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。

稍等片刻,GPG Key就能生成好了,验证一下是否生成成功:
  ```gpg --list-keys```
如果输出类似信息就代表属于你的GPG Key生成成功了:passphrase自己设定

![这里的A4A32896就是以后在GIT中用的公匙密码为你生成PGP是自己设置的密码](http://upload-images.jianshu.io/upload_images/2926249-860ed188abd165cb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

下面开始用PGP tag

cyx@RK-CYX-D1 MINGW64 /d/git/learngit (master)
$ git log --pretty=oneline --abbrev-commit
d8062cb fixed reame ok
f05639a modified readme
2a3666a merge & fix hello.py
9ef15f4 add elephant2
a0d1ca4 add /user/en
8666c24 merged bug fix 101
abc0990 fix bug 101
8cbd7f4 merge with no-ff
e2d773b add merge
d400c00 confilct fixed
945acb1 &simple
839be32 AND simple
554b4e6 branch test
bfc0334 第三次提交
88cb0ad remove test.txt
17c39eb add test.txt
3b4badb 第二次修改
2773256 git tracks changes
82ca6bd unstandstand how stage works
bd0e963 append GPL
0d9f2b9 delete 1 line,add 2 line
31084a3 add touch news 2 line
52dd2dd add 3 files
b2b63cf wrote a readme file

###################
$ git tag -u "A4A32896" -s v0.12 -m "signed version 0.2 released" 52dd2
###################

之后查看:

cyx@RK-CYX-D1 MINGW64 /d/git/learngit (master)
$ git tag
V0.2
V0.3
V0.9
V1.0
v0.12

cyx@RK-CYX-D1 MINGW64 /d/git/learngit (master)
$ git show v0.12
tag v0.12
Tagger: elephant2 2224168716@qq.com
Date: Thu Feb 23 15:47:57 2017 +0800

signed version 0.2 released
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iJwEAAECAAYFAliuk60ACgkQtP2GIaSjKJZZxAP/ZpTsnikWOpswkrhU+yaMiSHC
OoqKw1W7F+XFbvTyiag++npB/i5m9ki+Us7qWf4Ac0PHlUMCN6/YoXc/DpkZn+he
xuW21CW1blC09DS7/XzatcXLfHmBVjtPVFykfX2XwXTepUqEhRvQbWBlmZeRwn2l
d5u49Rt2nxfSY91ujYw=
=qd7v
-----END PGP SIGNATURE-----

commit 52dd2ddebee7973ae53fb702514c8cbe0400b336
Author: elephant 2224168716@qq.com
Date: Wed Feb 22 14:21:55 2017 +0800

add 3 files

diff --git a/file1.txt b/file1.txt
new file mode 100644
index 0000000..e69de29
diff --git a/file2.txt b/file2.txt
new file mode 100644
index 0000000..e69de29

cyx@RK-CYX-D1 MINGW64 /d/git/learngit (master)```

命令git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id;

git tag -a <tagname> -m "blablabla..."可以指定标签信息;

git tag -s <tagname> -m "blablabla..."可以用PGP签名标签;

命令git tag可以查看所有标签。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,183评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,850评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,766评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,854评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,871评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,457评论 1 311
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,999评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,914评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,465评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,543评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,675评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,354评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,029评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,514评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,616评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,091评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,685评论 2 360

推荐阅读更多精彩内容

  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,665评论 9 163
  • Add & Commit git init 初始化一个 Git 仓库(repository),即把当前所在目录变成...
    冬絮阅读 4,846评论 0 9
  • HTTP本身是一个协议,是从web服务器传输超文本到本地浏览器到传递协议 HTTP只能有客户端发起,服务端返回结果...
    vera1996阅读 227评论 0 0
  • 1.教师的任务不仅仅是教给学生什么,而是引导学生,引导学生走适合自己的路。 2.做立人的长效教师,突出对学生的六育...
    蓦然回首陈艳阅读 674评论 0 1
  • Java 冗长的代码是可能是Java语言自身最大的不足了,而Lombok正是为了弥补这一不足而流行的工具,Lomb...
    皮多堡阅读 466评论 0 3