2022年2月28日星期一

使用gpg签署git

gpg

GNU Privacy Guard(GnuPG或GPG)是一个密码学软件,用于加密、签名通信内容及管理非对称密码学的密钥,是自由基金会开发的OpenPGP软件,遵循OpenPGP数据加解密标准(RFC 4880),与PGP保持兼容。

使用方法见:https://daemonyang.blogspot.com/2021/12/gpg.html

查看本地gpg密钥列表

$ gpg -k

创建gpg密钥

$ gpg --gen-key

git默认gpg密钥

可以配置全局/本地的默认签名密钥

添加到全局

$ git config --global user.signingkey 23E3B35D753BC78E

或者使用--local配置单个项目

$ git config --local user.signingkey 23E3B35D753BC78E

配置的默认签名密钥可供git commitgit tag使用

使用gpg签名提交

使用-S[<keyid>], --gpg-sign[=<keyid>]选项指定git commit使用的gpg签名

keyid为可选项,如果指定,必须紧挨着-S,中间不能有空格;如果不指定,则使用提交者信息Your Name <your@email.address>来查找gpg密钥并使用;如果配置了user.signingkey,则采用user.signingkey配置的默认gpg密钥进行签名

譬如gpg签名密钥的ID23E3B35D753BC78E

$ git commit -S23E3B35D753BC78E -m "commit message"

$ git commit --gpg-sign=23E3B35D753BC78E -m "commit message"

通过git log --show-signature可以查看带签名信息的提交记录

commit.gpgSign强制签名

可以设置commit.gpgSign配置项,强制git commit使用gpg密钥签署每个提交:

$ git config --global commit.gpgsign true

或者使用--local配置单个项目

$ git config --local commit.gpgsign true

取消强制签名配置

使用--no-gpg-sign选项取消commit.gpgsign配置项设置的强制签名限制

使用gpg签名tag

-s默认密钥签名

git tag命令使用-s, --sign选项时,会根据提交者信息Your Name <your@email.address>来查找gpg密钥用来签署tag;如果配置了默认签名密钥user.signingkey,则使用默认密钥进行签名。示例:

$ git tag -s v1.0.1 -m "tag v1.0.1"

如果你不希望使用自定义gpg密钥,可以配置默认签署密钥:

$ git config --global user.signingkey 23E3B35D753BC78E # 或者使用--local配置单个项目

签署完成可以使用git show来查看:

$ git show v1.0.1
tag v1.0.1
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:29:41 2014 -0700

tag v1.0.1
-----BEGIN PGP SIGNATURE-----
iQEcBAABAgAGBQJTZbQlAAoJEF0+sviABDDrZbQH/09PfE51KPVPlanr6q1v4/Ut
LQxfojUWiLQdg2ESJItkcuweYg+kc3HCyFejeDIBw9dpXt00rY26p05qrpnG+85b
hM1/PswpPLuBSr+oCIDj5GMC2r2iEKsfv2fJbNW8iWAXVLoWZRF8B0MfqX/YTMbm
ecorc4iXzQu7tupRihslbNkfvfciMnSDeSvzCpWAHl7h8Wj6hhqePmLm9lAYqnKp
8S5B/1SSQuEAjRZgI4IexpZoeKGVDptPHxLLS38fozsyi0QyDyzEgJxcJQVMXxVi
RUysgqjcpT8+iQM1PblGfHR4XAhuOqN5Fx06PSaFZhqvWFezJ28/CLyX5q+oIVk=
=EFTF
-----END PGP SIGNATURE-----

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

-u自定义密钥签名

可以使用-u <keyid>, --local-user=<keyid>选项手动指定gpg密钥:

$ git tag -u 23E3B35D753BC78E v1.0.1 -m "tag v1.0.1"

tag.gpgSign

可以设置tag.gpgSign配置项,强制git tag使用gpg密钥签署每个tag

$ git config --global tag.gpgsign true

或者使用--local配置单个项目

$ git config --local tag.gpgsign true

注意,-u <keyid>, --local-user=<keyid>选项不受这个配置项控制

--no-sign取消强制签名配置

使用--no-sign选项取消tag.gpgSign配置项设置的强制签名限制

git merge合并

--verify-signatures检查签名

git merge命令可以使用--verify-signatures选项检查并拒绝携带可信密钥签署的提交:

$ git merge --verify-signatures non-verify-branch
fatal: Commit ab06180 does not have a GPG signature.

-S签署合并生成的提交

-S[<keyid>], --gpg-sign[=<keyid>]选项使用方式与git commit的同名选项相同,可以为合并生成的提交使用密钥进行签署

$ git merge --verify-signatures -S  signed-branch
Commit 13ad65e has a good GPG signature by Scott Chacon (Git signing key) <schacon@gmail.com>

You need a passphrase to unlock the secret key for
user: "Scott Chacon (Git signing key) <schacon@gmail.com>"
2048-bit RSA key, ID 0A46826A, created 2014-06-04

Merge made by the 'recursive' strategy.
 README | 2 ++
 1 file changed, 2 insertions(+)

git pull拉取提交

--verify-signatures检查签名

git pull命令也可以使用--verify-signatures选项检查并拒绝携带可信密钥签署的提交:

$ git pull --verify-signatures origin master
fatal: Commit ab06180 does not have a GPG signature.

-S签署合并生成的提交

-S[<keyid>], --gpg-sign[=<keyid>]选项使用方式与git merge相同,可以为合并生成的提交使用密钥进行签署

$ git pull --verify-signatures -S  signed-branch

git push推送

--no-signed--signed=false

不签署推送

--signed--signed=true

签署推送,如果服务器不支持签署推送,则推送失败

--signed=if-asked

如果服务器支持签署推送,则签署;不支持则不签署,不会直接失败

git rebase

-S签署变基生成的提交

-S[<keyid>], --gpg-sign[=<keyid>]选项使用方式与git merge相同,可以为变基生成的提交使用密钥进行签署

$ git rebase -S  signed-branch

AndroidStudio使用gpg签名

修改配置文件:

# Linux/macOS
~/.gnupg/gpg.conf
# Windows 10
C:\Users\<user name>\.gnupg\gpg.conf

添加:

use-agent
no-tty
default-key 23E3B35D753BC78E

Windows无法找到gpg密钥问题

git commit -a -S -m "modify .gitignore file"
gpg: skipped "A012BF1DEF404999678A307A23E3B35D753BC78E": No secret key
gpg: signing failed: No secret key
error: gpg failed to sign the data
fatal: failed to write commit object

解决

https://stackoverflow.com/a/51009405

$ git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"

参考

gpg

man page: git-config

man page: git-commit

man page: git-tag

man page: git-merge

man page: git-pull

man page: git-push

man page: git-rebase

Telling Git about your signing key

https://docs.github.com/en/github/authenticating-to-github/managing-commit-signature-verification

Set up Keybase.io, GPG & Git to sign commits on GitHub

Android Studio and Git - How do I GPG-sign my commits?

Ubuntu20.04安装tmux及修改快捷键

Ubuntu 20.04.3 LTS安装tmux:

apt安装

$ sudo apt-get update
$ sudo apt install tmux
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libevent-2.1-7 libutempter0
The following NEW packages will be installed:
  libevent-2.1-7 libutempter0 tmux
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 438 kB of archives.
After this operation, 1,222 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
$ tmux -V
tmux 3.0a

编译安装

下载并解压到本地

$ wget https://github.com/tmux/tmux/releases/download/3.2a/tmux-3.2a.tar.gz
$ tar -zxvf tmux-3.2a.tar.gz
$ cd tmux-3.2a

安装所需工具

$ sudo apt install libevent-dev ncurses-dev build-essential bison pkg-config

编译

$ ./configure && make

安装

$ sudo make install
make[1]: Entering directory '/home/**/tmux-3.2a'
 /usr/bin/mkdir -p '/usr/local/bin'
  /usr/bin/install -c tmux '/usr/local/bin'
make  install-exec-hook
make[2]: Entering directory '/home/**/tmux-3.2a'
if test xmdoc = xmdoc; then \
	sed -e "s|@SYSCONFDIR@|/etc|g" ./tmux.1 \
		>./tmux.1.mdoc; \
else \
	sed -e "s|@SYSCONFDIR@|/etc|g" ./tmux.1| \
		mawk -f ./mdoc2man.awk >./tmux.1.man; \
fi
/usr/bin/mkdir -p /usr/local/share/man/man1
/usr/bin/install -c -m 644 ./tmux.1.mdoc \
	/usr/local/share/man/man1/tmux.1
make[2]: Leaving directory '/home/**/tmux-3.2a'
make[1]: Nothing to be done for 'install-data-am'.
make[1]: Leaving directory '/home/**/tmux-3.2a'
$ tmux -V
tmux 3.2a

卸载

$ sudo make uninstall

命令模式

进入tmux任一面板pane,按下前缀键 + :进入命令模式,输入命令语句执行。默认前缀键为Ctrl+b,首先同时按下Ctrl键和小写字母b键,然后同时按下Shift键和:/;键,即可。

配置

配置文件

  1. 系统级配置文件:/etc/tmux.conf

  2. 用户级配置文件:~/.tmux.conf

配置文件内容为一系列的tmux命令,在tmux server启动时依次执行配置文件中的命令语句

配置文件只有在tmux server启动时才会加载,修改了配置文件时需要重启服务或者重载配置文件

关闭服务重启

进入命令模式输入命令:

:kill-server

关闭服务后所有会话session会被关闭,重新创建session即可完成重启

重载配置文件

在命令模式下输入命令:

:source ~/.tmux.conf

即可重新加载配置文件

修改快捷键

修改前缀键(prefix key)

前缀键通过prefix选项设置,默认为C-bCtrl+b,修改为Alt-b

通过命令

进入命令模式,输入命令:

:set -g prefix M-b

通过配置文件

配置文件~/.tmux.conf加入一行:

set -g prefix M-b

进入命令模式,输入命令重新加载配置文件

:source ~/.tmux.conf

修改分屏键

通过命令

进入命令模式输入命令:

:bind-key -T root M-d split-window -h
:bind-key -T root M-D split-window

通过配置文件

配置文件~/.tmux.conf加入:

bind-key -T root M-d split-window -h
bind-key -T root M-D split-window

重新加载配置文件即可

参考

tmux README

Installing tmux

Android logcat

Log等级 Android log 等级在 android/log.h 中定义如下: typedef   enum   android_LogPriority {    /** For internal use only. */ ANDROID_LOG_UNKNOWN =...