最近在学廖老师的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自己设定

下面开始用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可以查看所有标签。