我们开始使用 git 作为 VCS,之前使用 SVN,并发现在 git 中您可以轻松区分更改和提交背后的真实人物。现在我们想知道为什么做出这样的设计选择以及是否有我们忽略的事情。
让我们假设以下情况:
- 每个人都已经向 gitlab 注册了 ssh 密钥
- 提交是not与 gpg 签署
- 每个人都使用注册的 ssh 密钥来使用 git bash
现在我们都知道author
and committer
只是 git 的元数据,很容易被欺骗,如下所示:
- git config --global --add user.email[电子邮件受保护] /cdn-cgi/l/email-protection
- git config --global --add user.name“隐身用户”
- git commit -m "你不知道我到底是谁" --author="Max Mustermann "
- git push
提交的元数据将如下所示:
Author: Max Mustermann <[email protected] /cdn-cgi/l/email-protection>
AuthorDate: Mon Jun 4 13:12:47 2018 +0200
Commit: Incognito User <I[email protected] /cdn-cgi/l/email-protection>
CommitDate: Mon Jun 4 13:13:26 2018 +0200
现在我想必须有一种方法可以找到用过的ssh key or 真人对于提交,因为终端和系统知道密钥,因此知道提交和推送背后的真实人员。
问题:不使用 gpg 签名就没有办法查出真人吗?
PS:不,我们并不是不信任对方来利用这一点,但我们很好奇并想了解。
Update- 复制 torek 评论中的信息,因为我相信这个上下文足够重要,它应该在答案本身中提供,而不仅仅是在评论中:
首先,你需要分开git from gitlab。据,直到...为止git就您而言,ssh 只是您可能用来连接服务器的协议之一。你的 ssh 密钥或其有效性对于 git 来说并不重要;这是您和您的服务器之间的事情,因为服务器会对您进行身份验证,以便它可以决定您是否有权通过 ssh 连接。
(服务器可能会执行更细粒度的授权检查,特别是对于像gitlab其全部功能就是与git集成。尽管如此,这是主持人的事,而不是 git 的事。)
像 gitlab 这样的托管服务可能会选择基于 ssh 密钥记录活动,也可能不会。即使他们这样做,也只能告诉您谁将提交推送到该服务器,这可能与作者不同or提交者。例如:
假设 Alice 编写了代码;她是作者。她将自己的作品寄给了鲍勃。 Bob 将代码放入本地 git 存储库中。 Bob 是提交者。 Bob 创建了一个捆绑文件并将其发送给 Cindy。现在,Cindy 将包含 Alice 代码的 Bob 提交加载到她的本地存储库中,然后使用以下命令推送到 gitlab她的 ssh 密钥。现在,git 本身并不关心 Cindy 在其中扮演的角色;她不是作者,也不是提交者。但如果 gitlab 选择基于 ssh 密钥记录活动,gitlab 可能会记录 Cindy 向该服务器引入了提交。
在 git 中创建可验证提交的方法是使用签名[1]。所以不,“如果不使用 [git 记录真人的机制],根本没有办法找出真人”。
请注意,这是由 Git 的分布式特性引起的。如果没有某种外部约束,就不可能判断 Cindy 是否合法地转发了 Alice 和 Bob 的工作。使用 SVN,有一个明确区分的中央服务器/真相来源,Alice 必须连接到该服务器来创建提交,之后 Bob 必须连接到该服务器,Cindy 必须连接到该服务器。每个人单独连接到服务器。与 SVN 不同,Git 并不认为这种情况一定会发生。如果您想自己强制执行此类策略,可以让您的服务器执行此操作。
-torek
[1] 虽然我不知道他们的观点是否已经改变,但至少一些 git 开发者很早就表示相信签名tags- 不直接签署提交 - 是正确的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)