如何在git中找到实际的提交者?

4
最近,我的一位同事在.gitconfig中使用了我的电子邮件和姓名来推送master分支的代码(道德上是错误的,但这主要是为了好玩)。由于git从配置文件中获取名称,而不是实际的ssh或登录名,所以其他人都能看到我的名字在提交记录中。
因为更改配置文件很容易,且不需要任何身份验证/授权。我想知道,是否有一种方法可以区分真正的我和假冒我的人?
注意:我的同事和我在回购中拥有类似的推送权限。 实际上,我们团队中的所有开发人员都是如此。 我们大多数人使用ssh的方式推送到git。

1
相关:https://mikegerwitz.com/papers/git-horror-story - spectras
1
这是关于使用GPG为每个提交添加个人的、加密安全的签名。其他人将无法使用您的密钥对提交进行签名。这是git核心功能的一部分。git文档的这个页面展示了如何使用它的基本原理。 - spectras
你需要阅读链接。提交签名是复杂的。每次提交都进行签名也有一些严重的麻烦。在所有选择中都存在权衡,但我认为对于大多数用户来说,进行身份验证的“正确位置”是在提交传输期间。也就是说,在fetch时,您应该检查传入的提交并确定是否信任它们,然后再合并或使用它们。在push时,您应该让接收系统检查传入的提交并确定是否信任它们,然后再接受它们。 - torek
@spectras 我猜有问题。我的同事提交代码时总是可以跳过“-s”,对吧?这样也会意味着是我提交的。还是你建议我总是使用“-s”,以确保没有其他人拥有它? - Abhishek
1
@spectras(和Abhishek):请注意,-s 只会添加一个文本行,内容为“Signed-off-by”。它是 -S (大写字母 S),用于对提交进行PGP签名。 - torek
显示剩余10条评论
2个回答

2
依我之见,您的同事在进行任何操作时,如果以您的身份进行标识,无论如何都应该使用他自己的用户名进行操作以便于审计跟踪。
话虽如此,如果该用户拥有正确的特权以将代码推送至代码库(使用自己的用户名),并且没有设置钩子来验证传入的提交是否匹配正在执行推送的人员,则我认为无法区分谁进行了这些提交。
这里是一个Pre-receive 钩子,它将验证推送代码的人员是否也是提交中所列出的作者。 点击这里 以获取更多信息。

pre-receive 钩子。我之前不知道有这样的东西!让我去查一下然后回复您 :) - Abhishek
啊,是的,有几个钩子可以创建验证脚本,一些是客户端的,一些是服务器端的。 - Matt Clark
1
在这个脚本中,我仍然可以在“authors”变量中添加其他用户名和密码,然后脚本就会失败,对吗?我的意思是,它不是全面的,或者我错过了什么吗? - Abhishek
换句话说,每当我提交时,Git 应该能够检查我的账户中是否添加了该电子邮件。如果没有,则不允许用户进行推送,并在添加电子邮件时向该电子邮件发送一封电子邮件,告知其已被添加到 xyz 账户中。我的意思是,这将是一种完全可靠的方式。 - Abhishek
1
话虽如此,验证推送者的身份也有其不完美之处,因为它要求您始终以可以验证推送者的方式进行推送。如果您要对身份进行断言,则签署提交本身可以保留将提交传递到此存储库或该存储库的人的灵活性。如果您真的担心有人可能会传递错误的补丁并声称它来自其他人。 - Mark Adelsberger
显示剩余5条评论

0

我曾经工作的地方没有发现需要验证提交者的身份。如果您确实有这个需求,那么您需要对提交进行签名。请参阅git commit--gpg-sign选项:https://git-scm.com/docs/git-commit


那么,我可以强制用户始终进行签名提交吗?如果可以,有什么方法? - Abhishek
您的源代码库可能会拒绝未签名提交的推送(使用git钩子)。该钩子可以在每个新提交中调用git verify-commit,如果提交未签名,则返回非0状态。请参阅git hooks文档以了解如何设置此功能。 - Mark Adelsberger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接