在windows版的sourcetree上设置gpg签名

题图来源(Code Lyoko E73的11分50秒位置)将浏览器拉窄即可看到全图。
PC版网页左上角从上到下第二个图标是目录,请多用目录。
网页右下角按钮为返回顶部,请多用返回顶部来查看顶部目录。

目录

  1. 简介
  2. 原理
  3. 程序准备
  4. 设置Gpg4win
  5. 设置github
  6. 设置sourcetree
  7. 疑难解答

本文章主要讲解在使用windows版sourcetree对github commit进行签名操作,本方法主要优点在于可根据不同仓库设置是否使用何种签名,而非全局使用某一特定签名。

简介

GPG签名是什么?怎样为你的 Commit 加上 GPG 的签名

为 Commit 带上 GPG 的签名就是一个很好的开始,它能够在一定程度上保证安全性。

简而言之就是类似账号两步验证之类的确保你的github账号创建的提交(commit)是你本人做出的而不是别人盗用你账号做出的,类似的方法有mega网盘的账户还原密钥。

原理

GPG入门教程 - 阮一峰的网络日志

程序准备

以下程序准备针对的操作系统环境是windows 10,git图形界面则是sourcetree。

安装Gpg4win

Gpg4win - Secure email and file encryption with GnuPG for Windows

安装sourcetree

sourcetree
一些设置建议可以参考[github pull request流程演示之安装sourcetree](github pull request流程演示.html#安装sourcetree)。

设置Gpg4win

安装的是Gpg4win,此处以Kleopatra为例,同样你也可以使用其他GPG密钥管理界面,密钥管理方法应该是类似的。选择菜单栏-文件-新建密钥对,根据提示自行创建密钥,也可以参考GPG入门教程 - 阮一峰的网络日志

注意, 邮箱账号需为你在github账号中验证过(verified)的邮箱,来源Generating a new GPG key - User Documentation,同时第8步中github也给你了隐藏邮箱的方法。

创建完毕后,点击刚才创建的密钥对,右键-细节,公钥就是Kleopatra里面的指纹部分,点击导出获得私钥,你刚才被要求输入的那段密码是用于保护私钥的密码,并不是私钥本身。

设置github

参考github官方文档Adding a new GPG key to your gitHub account - User Documentation,以及官方推荐的设置步骤About commit signature verification - User Documentation - gpg

此处github需要粘贴进去的gpg key指的是在前一个步骤中生成的私钥。

设置sourcetree

严格意义上这里并不是设置sourcetree,而是设置每个仓库(repository)提交所需的配置文件,位置是:

仓库文件夹/.git/config

全局(global)配置文件在windows当前用户的用户文件夹根目录下:

C:/Users/你的用户名/.gitconfig

当然如果你用命令行操作git的话,可以参考git官方文档的local参数说明git - git-config Documentation - local和配置文件读取顺序说明git - git-config Documentation - files

根据配置文件读取顺序说明,可以得知git提交(commit)的时候,在不加特定参数时,会先读取全局配置文件(global git config),然后再读取本地配置文件(local git config),如果在全局配置文件里面设置了特定用户的gpg签名,而你有多个github用户或者多个gpg签名或者有的仓库不想使用gpg签名的时候,就会出现混乱。

本篇文章原创部分最大的地方也就在这里换句话说其他地方都是抄的,之前我参照的一个教程在Windows版的Sourcetree上启用GPG签名只说了全局的方法,但是如上所述会出现混乱的情况,所以我这里给出的方法是不在全局配置文件处进行设置。而是对每个仓库的配置文件进行设置,设置方法和全局配置文件的写法一样,添加以下字段即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[user]
name =
# name指gpg签名生成时你填的名字
email =
# email指gpg签名生成时你填的邮箱
signingkey =
# signingkey指公钥ID的后八位,或者说指纹的后八位
[commit]
gpgSign = true
# 此处gpgSign的值可为true或者falsetrue指开启gpg签名
[gpg]
program = c:\\Program Files (x86)\\GnuPG\\bin\\gpg.exe
# 这里program的位置是Gpg4win安装时的默认位置
# 如果你当时没装在这个路径,请自行修改
# 注意两条反斜线中一条是用来转义的,务必确保路径名中的反斜线是有两条的

这样设置好了以后,再提交的时候,git就会调用gpg,要求你对提交进行签名,此时你需要输入那串用于保护私钥的密码。

疑难解答

前面所讲都是让sourcetree使用内嵌的git的情况下进行的操作,因为sourcetree使用oauth绑定多个github账号时的[各种问题](github pull request流程演示.html#推送-push-你刚才的提交-commit),所以没怎么试过用外部git单独操作的情况是否能成功设置。理论上这套教程也可以用于单独安装的git,毕竟以上各种玄学问题的解释都是从git的官方文档里找的,我本人尝试的结果是可以用于强制推送的指令,其他还没试过。