有没有一种简便的方法使Git始终对创建的每个提交或标签进行签名?
我尝试了以下内容:
alias commit = commit -S
但这并没有奏效。
我不想安装其他程序来实现这一点。这可行吗?
只是一个小问题,也许提交不应该被签名,只有我从未创建过的标签(像Homebrew等项目的单个提交)。
有没有一种简便的方法使Git始终对创建的每个提交或标签进行签名?
我尝试了以下内容:
alias commit = commit -S
但这并没有奏效。
我不想安装其他程序来实现这一点。这可行吗?
只是一个小问题,也许提交不应该被签名,只有我从未创建过的标签(像Homebrew等项目的单个提交)。
-S
以确保您的提交已签名,则有一个提议(分支'pu
',目前为2013年12月,因此不能保证它将被包含在git发行版中)添加一个配置项,可以为您处理该选项。commit.gpgsign
选项以对所有提交进行签名-S
选项。commit.gpgsign
配置选项可自动签名所有提交。commit.gpgsign
cd /path/to/repo/needing/gpg/signature
git config commit.gpgsign true
user.signingKey
与全局设置结合使用(在所有想要签署提交的仓库中使用的唯一密钥)。git config --global user.signingkey F2C7AB29!
^^^
正如ubombi在评论中建议的那样(并在“GPG硬件密钥和Git签名”中解释,基于“如何指定用户ID”),当使用gpg时,可以添加感叹号(!
)来强制使用指定的主要或次要密钥,而不是尝试计算要使用哪个主要或次要密钥。
如果您正在使用像YubiKey这样的设备(推荐),则不需要担心感叹号,因为对于主密钥对,您应该只有以下签名密钥可用:
- 主密钥本身,其后面应该有一个
#
表示它不可用,- 以及带有
>
的私有子密钥,表示它是指向YubiKey作为唯一可用签名密钥的存根。仅当您将所有私钥保留在系统上时(不好的做法),才可能有必要防止自动选择可用的签名密钥。
user.signingKey
在 git 1.5.0(2007年1月)引入,commit d67778e:
我不应该被要求在我的 git 存储库和我的 gpg 密钥中使用相同的名称形式。
此外,我可能在我的密钥环中有多个密钥,并且可能想要使用一个与我在提交消息中使用的地址不匹配的密钥。
这是通过 commit aba9119(git 1.5.3.2)强制实施的,目的是为了捕获这样一种情况:如果用户在其此补丁添加了一个配置条目 "
user.signingKey
",如果存在,将传递给 gpg 的 "-u" 开关,允许覆盖标签签名密钥。
.git/config
中错误配置了user.signingKey
或者在其密钥环中没有任何秘密密钥。signingKey
而不是 signingkey
,尽管 git config
键是大小写不敏感的。这只有在执行 git config --get-regexp
命令时才会产生影响,因为该命令是区分大小写的,否则,这只是一种可读性约定;git push --signed
命令未考虑 user.signingKey
配置值;user.signingKey
强制签署注释标签和提交:提交 61c2fe0。!
。例如:git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14!
- ubombi!
)。 - VonC~/.gnupg/gpg-agent.conf
并添加pinentry-program /usr/bin/pinentry-gtk-2
(遵循此指南https://wiki.archlinux.org/index.php/GnuPG#pinentry)。 - Iakovos Gugpg --list-keys --fingerprint
会显示密钥的长格式(我想你得手动去掉空格)。 - Suzanne Soygpg --list-keys --keyid-format long
显示长格式,没有空格 :) - Ictus编辑:截至Git版本1.7.9,可以使用 GPG 密钥签署 Git 提交(git commit -S
)。稍微更新答案以反映这一点。
问题的标题是:
有没有办法在 Git 中使用 GPG 密钥“自动签名”提交?
简短回答:是的,但不要这样做。
纠正问题中的拼写错误:git commit -s
不会签名提交。相反,根据man git-commit
页面:
-s,--signoff
添加由提交者签署的 Signed-off-by 行到提交日志消息的末尾。
这将产生类似以下的日志输出:
± $ git log [0:43:31]
commit 155deeaef1896c63519320c7cbaf4691355143f5
Author: User Name
Date: Mon Apr 16 00:43:27 2012 +0200
Added .gitignore
Signed-off-by: User Name
请注意"Signed-off-by: ..."部分; 这是由-s
标志在 git-commit
上生成的。git-tag -[s|u]
来实现; 如果您要这样做,您可能需要在〜/ .gitconfig
或项目特定的.git / config
文件中设置密钥ID。有关该过程的更多信息,请参见git社区书籍。签署标记比签署您进行的每个提交有无限用处。git blame
指向他想要的任何人。 - Vi.commit.gpgsign
选项(始终对每个提交进行签名),这是否意味着参数已丢失?如果这是“完全愚蠢”的话,为什么还要提供这个选项? - Andy Hayden为了在 Git 版本 2.0 之前使自动签名生效,您需要为提交添加 Git 别名。
# git config --global alias.commit "commit -S"
[alias]
commit = commit -S
首先设置你想要签署所有提交、标签和推送的公钥。要获取公钥,请使用以下命令
% gpg --list-keys --keyid-format=short
/home/blueray/.gnupg/pubring.kbx
-------------------------------
pub rsa3072/F6EED39A 2021-12-25 [SC] [expires: 2023-12-25]
在这种情况下,公钥是F6EED39A
。现在运行以下命令。
git config --global user.signingkey F6EED39A
git config --global commit.gpgSign true // sign all commits
git config --global tag.gpgSign true // sign all tags
git config --global push.gpgSign true // sign all push
push.gpgSign true
,当服务器不支持签名推送时,推送将失败。另一种选择是使用:git config --global push.gpgSign "if-asked"
如果服务器支持,建议签署所有推送操作。
现在,您的所有提交、标签和推送都将自动使用您提供的公钥进行签名。
有时您可能需要覆盖这些设置。
对于提交,请使用 git commit --no-gpg-sign -m "Unsigned commit"
对于标签,请使用git tag --no-sign <tag-name>
对于推送,请使用git push --no-signed
或--signed=false
。
你需要明确表示,如果你签署了一个提交或标签,那么你并不意味着你批准了整个历史记录。在提交的情况下,你只签署了当前的更改,而在标签的情况下,你需要定义你的意思。你可能已经拉取了一个声称来自你的更改,但实际上不是(因为其他人将其推送到了你的远程仓库)。或者这是一个你不想要的更改,但你只是签署了标签。
在典型的开源项目中,这种情况可能较少见,但在企业场景中,你只偶尔接触代码,而且你不会阅读整个历史记录,这可能会被忽视。
如果提交将被重新基于或挑选到其他父级,则签署提交是一个问题。但如果修改后的提交可以指向实际验证的“原始”提交,那就很好了。
commit.gpgsign
设置为true,则合并提交将由您签名。 - Jay
git filter-branch -f --commit-filter 'git commit-tree -S "$@"' HEAD@{u}..HEAD
(我并不是说你应该使用这个命令)。 - Vi.