有什么方法可以确保谁是我们 Git 存储库的实际提交者?我们在 CloudBees 中拥有每个开发人员的密钥,因此可以确保它是其中之一,但是有什么阻止一个开发人员在提交字段中输入另一个开发人员的姓名/电子邮件?如果没有办法阻止它们,是否有办法至少从 Git 日志中确定提交者的 SSH 密钥?
2 回答
不,Git 本身没有内置机制来确保提交者实际上是存储在提交对象中的那个。有这样的限制实际上有缺点。Git 是一个分布式版本控制系统,因此提交被分发到不同的地方,而不必集中在一个中心位置。即使有一个用于收集所有稳定(或其他)更改的中央存储库,通过所述存储库以外的其他方式传输更改仍然完全没问题。
例如,如果开发人员 A 和 B 都从“中央”存储库克隆,A 仍然可以处理一些事情,然后将这些更改显式发送给 B 以进行审查,而无需通过中央存储库(例如,通过推送到 B 的存储库,或 B 从 A 中提取)。想象一下,B 然后基于这些更改提交一些提交,然后想要将其发布到中央存储库,而不是让 A 先将他自己的更改推送到那里。如果有一些限制只允许您自己提交的更改,那么 B 将无法在这种情况下推动 A 的更改。
由于这样的工作流在真正的分布式工作流中非常常见,因此通常不会应用这样的限制。但是我仍然可以理解为什么会这样做,可能仅限于少数新开发人员或其他人。
确实有一些方法可以强制执行这种限制。请注意,Git 本身无法根据 SSH 密钥检查任何内容。Git 有一个简单的协议,所有的身份验证和授权都不是由 Git 直接处理的(Git 不支持任何一种)。例如,对存储库的 SSH 访问由操作系统的标准 SSH 访问规则处理;对于 https 访问,http 服务器处理身份验证。
Git 的一个常见访问层是Gitolite。它使用单个用户控制通过 SSH 的访问。本质上,它基于其 SSH 密钥将用户的访问权限限制为一组非常小的特定于 Git 的命令。您可以为它编写自己的插件,这将要求提交始终具有与推送用户相同的提交者;或者您可以使用它附带的电子邮件地址来使用已经实现的功能。为此,请参阅手册中的“检查作者电子邮件”部分。
顺便提一句。确保提交的提交者实际上是它所说的提交者的常用方法是签署提交。虽然它不会阻止以其他人的身份提交,但它允许您检查提交者的身份。
您可以使用Gitolite来控制对您的存储库的访问;Gitolite 提供了一些工具,用于添加更精细的控制,以控制谁可以访问单个存储库或分支,以及谁可以更新哪些文件。它还允许您记录哪个用户推送了哪些更改。
通过 SSH 使用常规 Git 不允许您这样做,因为它仅使用 Unix 权限来控制访问,并且不会记录谁进行了特定的推送。而且您也无法阻止人们伪造提交字段中列出的人;任何人都可以在其中放置他们想要的任何价值。