原文地址http://airk000.github.io/git/2013/09/30/git-tag-with-gpg-keyhtml
###Tag用來作什麼?git
Tag即標籤,用以給項目倉儲打標籤,一般用做里程碑標識,以方便項目進度、發佈版本管理及規劃。
Git tag能夠用來建立標籤,列出標籤表,刪除標籤及用以驗證帶有GPG簽名的帶標籤的項目。github
git tag v1.0 >標記當前位置爲tag,tag名爲v1.0 git tag -m "Say something" v1.0 >標記當前位置爲tag,tag描述爲"Say something", tag名爲v1.0
git tag (-l) >列出tag表,只顯示標籤名 git tag -ln >列出tag表,並顯示其message(描述)
git tag -d [tag name] >刪除某個tag
git tag -v [tag name] >驗證某個tag的GPG簽名
GPG是加密軟件,可使用GPG生成的公鑰在網上安全的傳播你的文件、代碼。redis
爲何說安全的?以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簽名驗證錯誤,不能正常使用。ui
說了這麼多,但願你們可以理解GPG簽名驗證的意義所在。下邊就說一說,如何在你的項目中使用這種方式。加密
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 您須要一個密碼來保護您的私鑰。 咱們須要生成大量的隨機字節。這個時候您能夠多作些雜事(像是敲打鍵盤、移動 鼠標、讀寫硬盤之類的),這會讓隨機數字發生器有更好的機會得到足夠的熵數。
生成過程當中可能出現相似提示:code
隨機字節不夠多。請再作一些其餘的雜事,以使操做系統能蒐集到更多的熵! (還須要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<airk908@gmail.com>) <airk908@gmail.com> sub 2048R/C9A00F19 2013-09-30
上邊顯示的是公鑰,順便也看一下與之匹配的私鑰生成如何:
gpg --list-secret-keys
若是成功,會顯示相似信息,不過文件位置應該是/home/keven/.gnupg/pubring.gpg(keven是個人用戶名,你的機器上該是你的)
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 <airk908@gmail.com>': 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 <airk908@gmail.com> 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<airk908@gmail.com>) <airk908@gmail.com>」
至此,帶有GPG簽名驗證的tag就作好了,其餘開發者將沒法修改你所簽名的這個tag。