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