Git 中的提交签名(上)

521 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

Git具有“签名”提交的功能,但什么是签名,有什么好处?

签名或代码签名是使用密码学以数字方式向数据添加签名的过程。数据的接收者可以验证签名是真实的,因此必须来自签名者。

它就像物理签名,但数字化且更可靠。

Git 的默认行为

首先让我们注意所有提交都具有以下属性:

  • 作者 - 完成工作的贡献者,这是信息性的。
  • 提交者 – 提交更改的用户。

在大多数情况下,它们是相同的,但它们可以在提交时被覆盖,因此注意区别很重要。

当你第一次安装 Git 时,你可能需要配置一些设置,即user.emailuser.name. 根据你的 Git 客户端,这可能已经为你处理好了。

在命令行中,这需要执行以下命令:

git config --global user.email "seth@example.org"
git config --global user.name "Seth Falco"

Git 提交是基于信任的,因此它会假设你输入了你的真实电子邮件和姓名。然后,你可以使用提供的详细信息提交并推送到 GitHub 和 GitLab 等远程提供商。

当其他人使用你的电子邮件地址,然后远程推送更改时会发生什么?

git config --global user.email "seth@example.org"
git commit -m "Jen did this."
git push origin main

Jen 做了一个提交,但它显示了我的名字和指向我的 GitHub 个人资料的链接。

结果看起来很正常,但我不是做这个提交的人。Jen 致力于她的存储库,使用她的 GitHub 凭据进行身份验证,但它显示了我的姓名并链接到我的个人资料。默认行为将作者和提交者都设置为git config.

在 GitHub 上,提交已经与我自己的没有区别。如果用户同时设置user.email和设置user.name为我的,他们可以从git log我的任何提交中获得,那么即使在本地它看起来也是一样的。

这意味着任何人都可以将他们的电子邮件地址设置user.email为你的电子邮件地址,并且看起来像是你做出了提交。

为什么 Git 会这样做?

你可能想知道为什么这是可能的。毕竟,当你推送到存储库时,你对你的帐户进行身份验证,它不应该使用该电子邮件吗?这看起来是不是有点瑕疵?

当你进行身份验证以推送到远程存储库时,你正在进行身份验证以执行此操作——推送更改。无论谁创作或提交,提交都不需要身份验证。

如果提交默认需要身份验证,则无法将项目迁移或镜像到其他平台。提交历史将包括前雇员、死用户、非活动帐户或不在其他平台上的电子邮件地址。

唯一的解决方案是重写历史以删除他们曾经参与过该项目,这并不理想。

另一种情况是,如果我在 GitHub 上分叉了一个项目,但想在 GitLab 上维护我的分叉。我的第一次推送将包括以前提交者的所有提交。对于大型项目,对每个提交者进行身份验证是不可行的。

提交的作者表示工作人员的归属,而不是工作人员的证明。

事实上,你总是可以在仅出于此目的提交时覆盖作者。使用该--author参数,你可以为全局设置指定不同的名称和电子邮件,甚至可以指定与存储库托管帐户无关的详细信息。

但是,在公共存储库中,代表没有帐户的人提交时要小心。姓名和电子邮件地址一经推送即成为公共信息,任何使用git log!

git commit -m "Jen didn't even author this." --author "Jen <jen@example.org>"
git push origin main

这与在 中使用另一封电子邮件具有不同的行为git config。这使得作者是我们在 中指定的--author,而提交者是我们在 中指定的git config

GitHub 显示 Jen 是作者,而我是提交者。

Weblate等翻译平台依赖此功能来确保翻译人员仍能获得归属,即使自动用户提交并打开拉取请求,而不是翻译人员。

如何证明你是 Git 的提交者

GNU Privacy Guard(GnuPG 或 GPG)允许你创建可用于数据加密和签名的加密非对称密钥对。它们由公钥和私钥组成。

你可以与任何人共享公钥——你可以将其上传到你的 GitHub 和 GitLab 帐户,或者将其放在互联网上供任何人访问。

顾名思义,私钥是私有的。你应该将此视为密码,并且在任何情况下都不应与任何人共享你的私钥。

我们将生成一个密钥对,然后将公钥上传到 GitHub 和 GitLab。使用你的私钥,你可以签署你的提交,并且具有公钥的服务器将使用它来确认它真的是你。