感谢Xavier 回答中的链接,我了解到我可以使用 gpg.program 配置覆盖 gpg 程序:
git config --global gpg.program /path/to/something
所以我可以用它来围绕keybase编写一个包装器。
但事实证明,git 对它的含义非常挑剔something
。Git 期望部分解析由--fd-status
标志产生的输出,这会导致在备用文件句柄处gpg
输出特殊状态代码。
幸运的是,至少在我第一次通过时,git 不会解析gpg 生成的所有内容,因此我能够模拟它。这是一个带有功能包装的要点,这是它的主要内容:
# Copy the commit message from stdin to a file.
d=$(mktmp -d "${TMPDIR:-/tmp}/gitsig.XXXXXXXXX")
cat > "$d/commit.msg"
# Have Keybase write the signature to another file.
keybase pgp sign --detached \
--key "$1" \
--infile "$d/commit.msg" \
--outfile "$d/commit.sig"
# Have gpg verify the signature right away.
# Capture its status in a file.
gpg --verify --status-fd=2 \
"$d/commit.sig" "$d/commit.msg" \
> /dev/null 2> "$d/gpgstatus.txt"
# Copy the KEY_CONSIDERED lines to stderr. Git wants that.
grep '^\[GNUPG:\] KEY_CONSIDERED' "$d/gpgstatus.txt" >&2
# Produce a minimal SIG_CREATED line to stderr. Git also wants that.
printf '[GNUPG:] SIG_CREATED ' >&2