原文地址:http://airk000.github.io/git/2013/09/30/git-tag-with-gpg-key
Git tag
Tag用來做什麼?
Tag即標籤,用以給項目倉儲打標籤,通常用作里程碑標識,以方便項目進度、發佈版本管理及規劃。
Git tag可以用來創建標籤,列出標籤表,刪除標籤及用以驗證帶有GPG簽名的帶標籤的項目。
git tag常見用法
創建Tag
git tag v1.0 >標記當前位置爲tag,tag名爲v1.0
git tag -m "Say something" v1.0 >標記當前位置爲tag,tag描述爲"Say something", tag名爲v1.0
列出tag表
git tag (-l) >列出tag表,只顯示標籤名
git tag -ln >列出tag表,並顯示其message(描述)
刪除tag
git tag -d [tag name] >刪除某個tag
驗證tag
git tag -v [tag name] >驗證某個tag的GPG簽名
GPG
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) <[email protected]>”
真實姓名: Keven Liu
電子郵件地址: [email protected]
註釋: GPG key for Keven
您選定了這個用戶標識:
“Keven Liu (GPG key for Keven) <[email protected]>”
更改姓名(N)、註釋(C)、電子郵件地址(E)或確定(O)/退出(Q)? O
您需要一個密碼來保護您的私鑰。
我們需要生成大量的隨機字節。這個時候您可以多做些瑣事(像是敲打鍵盤、移動
鼠標、讀寫硬盤之類的),這會讓隨機數字發生器有更好的機會獲得足夠的熵數。
生成過程中可能出現類似提示:
隨機字節不夠多。請再做一些其他的瑣事,以使操作系統能蒐集到更多的熵!
(還需要174字節)
瘋狂的敲打鍵盤吧,不過看好還需要多少,悠着點。
稍等片刻,GPG Key就能生成好了,驗證一下是否生成成功:
gpg --list-keys
如果輸出類似信息就代表屬於你的GPG Key生成成功了:
/home/keven/.gnupg/pubring.gpg
------------------------------
pub 2048R/AF26C87F 2013-09-30
uid Keven Liu (Gpg key for Keven Liu<[email protected]>) <[email protected]>
sub 2048R/C9A00F19 2013-09-30
上邊顯示的是公鑰,順便也看一下與之匹配的私鑰生成如何:
gpg --list-secret-keys
如果成功,會顯示類似信息,不過文件位置應該是/home/keven/.gnupg/pubring.gpg(keven是我的用戶名,你的機器上該是你的)
使用GPG加密你的tag
git tag -s "My tag message" v1.0 >是的,將-m 換做-s就是加密簽名了
不過,好像很多人會出現錯誤,比如:
gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information
gpg: skipped `Keven Liu <[email protected]>': secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the tag
fatal: unable to sign the tag
這個錯誤一Google的話都是教你怎麼生成一個GPG Key,其實不然,git tag有一條help這樣寫到:
-u, --local-user <key-id> 使用另一個Key簽名此tag
所以,這個錯誤可以這樣解決:
git tag -u "Keven Liu" -s "My tag message" v1.0
這樣,你的tag就用剛剛生成的GPG Key簽名了。可以查看一下項目的tag驗證信息:
git tag -v v1.0
終端輸出:
object c88d710635a97e6a634d2a1b25e3eba2f8a3574e
type commit
tag v1.0
tagger Keven Liu <[email protected]> 1380552288 +0800
My first tag with gpg key of my own
gpg: 於 2013年09月30日 星期一 22時45分05秒 CST 創建的簽名,使用 RSA,鑰匙號 AF36C27F
gpg: 完好的簽名,來自於“Keven Liu (Gpg key for Keven Liu<[email protected]>) <[email protected]>”
至此,帶有GPG簽名驗證的tag就做好了,其他開發者將無法修改你所簽名的這個tag。