我们刚刚开始使用 Git 进行源代码管理。我们有一个中央存储库并通过 SSH 访问它,因此我们在中央服务器上的 authorized_keys 文件中设置了各自的 key 。
当你在 git 中提交时,与提交关联的元数据包括例如 user.name,但据我们所知,没有什么能阻止我将我的 user.name 设置为另一个用户的 user.name 并假装他/她做出了 promise 。
在 git 中有什么办法可以防止这种情况发生吗?例如将 user.name 与特定的 SSH key 相关联?
顺便说一句,我的问题不是为什么 git 允许这样做,我读过有有效的用例。我的问题是,如果我们不想允许,是否可以通过任何方式阻止这种情况?
谢谢
最佳答案
正如您所注意到的,Git 允许任何用户进行任何提交,并将作者和/或提交者姓名和电子邮件地址设置为任何(可解析的)值。 (任何用户也可以将任何提交的作者和/或提交者日期设置为任意值,只要它是 Git 视为可用的日期戳即可。)
在中央服务器上检查这些东西的方法是注意 git push
推送 commits,然后要求或告诉服务器设置一个或多个引用名称——通常是一些分支和/或标签名称——指向新的提交。这些请求被传递给 pre-receive
和 update
钩子(Hook),它们可以以它们(钩子(Hook))喜欢的任何方式测试新提交,接受或拒绝引用名称更新。
pre-receive
Hook 在标准输入上一次获取所有更新请求,并且可以拒绝整个推送。如果它接受推送,update
Hook 然后一次获取每个更新请求(作为命令行参数),并可以拒绝该特定更新。
Git 本身并没有内置任何东西来做这一切,但是 there are some add-ons such as Gitolite that can do this for you .
如果您想使用粗略的“作者姓名必须匹配 ssh 凭据”方法以外的方法来执行此操作,您可以考虑在每次提交时要求数字签名(但请注意,中央服务器仍然必须检查这些签名,我不要认为在 Gitolite 中有什么可以做的)。这实际上更加棘手;通常不会签署个人提交,而是签署带注释的标签。由于提交具有身份验证树 ( Merkle tree ) 的形式,因此签署特定标签意味着您不仅信任该标签的提交,而且还信任其所有祖先提交。 (这种暗示的强度取决于签署它的人的意思,要弄清楚他们的意思你必须问他们。)
关于git 阻止模拟另一个用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37295783/