1. 程式人生 > 實用技巧 >簽名你的每個 Git Commit

簽名你的每個 Git Commit

給每個 Commit 簽名

作為個人開發者,給自己的每個 Commit 簽名,可能有點多此一舉(或許會有這麼想的人),但是在一個多人合作開發的專案裡,管理員可以要求所有的專案成員,都必須簽名自己的 Commit,不接受未經簽名的 PR,那就產生了一定的意義(雖然是什麼意義我還沒想得太明白)。

上面圖裡個 Verified 標記,是 GitHub 自動給打上的,因為一個專案的第一個 Commit 是在我生成專案的時候,由 GitHub 的 Web 站點自動提交的,是專案的初始化 Commit。這種情況由 GitHub 方面利用你在網站可信的登入態進行簽名。但是我們知道,這是一個分散式版本控制,一般來說,Commit 都是在本地完成的,然後 Push 到雲端,所以,要想讓每個 Commit 都能夠帶有簽名驗證,需要在本地部署簽名的過程。怎麼做呢?

在 GitHub 驗證一個郵箱

我們在 git 裡面,進行 commit 操作的時候,都需要設定一個 user.name 和 user.email,所以,對 commit 的簽名,是基於 email 的。第一個步驟就是在 GitHub 的 Settings 裡面,設定一個用於關聯簽名演算法的 email。你可能已經有了多個 email,在本地,需要設定那個關聯了 GPG 簽名的 email 來提交程式碼。

生成一個 GPG 的 key

剛才已經說了,簽名的原理是使用 GPG,其實 GitHub 還支援 S/MIME,我不知道那是什麼,所以就選 GPG了。

GitHub 支援的加密演算法有:

  • RSA
  • ElGamal
  • DSA
  • ECDH
  • ECDSA
  • EdDSA

如果加密演算法不在上述之中,可能無法被 GitHub 所驗證。如果,你的環境沒有安裝 GPG,第一步你可能需要安裝一下:

brew install gpg2 # 我的環境是 Mac 就用 Homebrew 安裝了

我在 Mac 上安裝的是 GPG 2.x,其實有 GPG 1.x 和 2.x 兩個版本,顯然大一點的更新一些,支援了很多新功能,不過,有可能你所在的系統環境只能選擇 1.x。2.1.17 版本以上的可以使用如下命令來生成 key:

gpg --full-generate-key

雖然官方說了支援上面 6 種演算法,但是在 GPG 指南這裡說,必須選擇 RSA,我不知道這個矛盾是為什麼,以後再來探究。上面的命令會開啟一個命令列互動式建立 key pair 的過程,問及演算法的時候,用預設的就行了,我用的 GnuPG 2.2.19,預設選項是 RSA and RSA。當問到 key 的長度的時候,要填寫 4096,因為官方指南要求這樣,而 GnuPG 的預設值是 2048,這裡需要注意。

接下來是過期時間,個人使用選擇 does not expire,永不過期就可以了。如果是團隊使用,看整個團隊的安全策略如何。

接下來要求填寫 ID 相關資訊,會填寫名字,郵箱,註釋,這裡郵箱是比較關鍵的,在第 1 步裡,咱們預先準備了要關聯的郵箱地址。就填上那個。然後是要求鍵入密碼。這個密碼的用途是保護你的私鑰。如果你自信不會有人入侵你的個人電腦,那麼你可以不填寫密碼,GnuPG 會很貼(fan)心(ren)地走兩遍這個要求密碼保護的過程,請耐心回車。(注:假如很不幸,一個黑客已經黑到你個人電腦了,用你的身份打開了你的 Term,這時候,如果你的私鑰是有密碼保護的,每當程式需要使用你的私鑰的時候,都必須輸入密碼,這個情況下,私鑰保護密碼就是最後一道屏障。)

gpg --list-secret-keys --keyid-format LONG
/Users/hubot/.gnupg/secring.gpg
------------------------------------
sec   4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid                          Hubot (Comment) <Hubot@a.com>
ssb   4096R/42B317FD4BA89E7A 2016-03-10

使用上述命令就可以檢視你 LONG 格式的私鑰了。這個私鑰就是要用來對你的每個 Commit 進行簽名的。

在 GitHub 登記你的公鑰

然後,咱們需要在命令列打印出來自己的公鑰,使用如下命令:

gpg --armor --export 3AA5C34371567BD2
# Prints the GPG key ID, in ASCII armor format

-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBF5bciABEADJ/FQa+ymIuKuZycgtPmLMPHEwOtYY21k7zU9ddDZH6ZGIxeN0
N9ljc6zp8/3cQDRrbrirHv/9WqaqSRb+EFcUog5LOfR/C6NeiGNW8AgUuFxGGFXK
s6VrAmzhIxDmKDkRdX9sHf7myiwBhtkFM0/8AGUdR8pjHKw+vA8IJzMhowWkiX1O
F1ZW81gKUYCLSfkty1HccGr4kFpE6r1R/w18hYH2zcr0dll0ox2LHfSHuuQzamew
hdR7B6S5Xi+EJjv7rujHaRWzLoPXktxUFme9LxdVblp6FD/lP79AkPhqSPAwzee+
ShlO9AScCCbsm8p3/KhmUn2yigbfd0eWvh4wm5HvbTCJ3/SLspMYrsF/VMHAJFRW
pmULevI5bdVR3fm7t/IgkjFasmbOZ9EqZNf43ljVi3SOyTmRX9GbxtvHXKL8tgL1
q7do0cArc/cKigEfssHe6gXChLZ6nDEzj/aNgOEcKo/cPVVCH4yzldEMvCB4aMYW
PET+7Io+FM1b69yOtFvKmJnGNpDbtySn1b6E0gWk/3uqzcspAzZMb6aIdZ6BcaXE
wU8zqRqcMXVnI6s2gvrMYrFCUB71ujzdGO9LWIu/y/FOdrzmrjXofOmdQom9Z+dW
cCo7LaTCE994HhLbqacsUROhjFCSzisH1yi0T0rD6oWSzsjFdewpEtjJGwARAQAB
tENDaGFybGVzIChHUEcga2V5IHVzZWQgZm9yIEdpdEh1YiBjb21taXQuKSA8Y2hh
cmxlc3RhbmdAZm94bWFpbC5jb20+iQJOBBMBCAA4FiEE6zd9skJwGmhOg6epkcp5
trRrrvQFAl5bciACGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQkcp5trRr
rvQ…… …… ……
-----END PGP PUBLIC KEY BLOCK-----

大概長上面那個樣子的,很長很長,整段拷貝下來,然後去 GitHub 個人的 Settings 介面 SSH and GPG keys 標籤裡,登記這個公鑰。登記完畢後,你能看到這個 key 關聯的 email 地址顯示出來了。

電腦刺繡繡花廠 http://www.szhdn.com 廣州品牌設計公司https://www.houdianzi.com

在 git 裡面設定使用簽名

咱們的公鑰私鑰對已經生成了,然後就是需要告訴 git 命令每次 Commit 的時候,都要使用私鑰進行簽名。

git config --global user.signingkey 3AA5C34371567BD2

上面的命令設定了全域性的簽名金鑰,如果你使用多個身份在多個專案提交程式碼,那麼不要使用 –global 引數,但是,要記得去每個專案裡設定單個專案範圍的簽名私鑰。然後,你要告訴 git 命令,以後每次 Commit 都要簽名:

git config commit.gpgsign true

也可以手動控制,那麼記得執行 git commit 的時候帶上 -S 引數。