对于版本控制而言,重要的一件事是知道谁做了哪些更改。如果事情发生了变化,我不知道为什么要做出改变,我会查看历史并询问做出改变的人。当我正在探索git时,让我对这个功能有点紧张的一件事是它看起来很容易伪造。什么阻止我将同事姓名/电子邮件放在user.name和user.email的git global config中?当使用像gitosis / gitolite(定义用户)或github(我假设使用像gitosis / gitolite这样的东西)之类的东西时,有没有什么可以看到谁真正做出了提交?
答案 0 :(得分:5)
Gitolite记录(在.gitolite/logs/gitolite-*
)每次推送的Gitolite用户。确定引入特定提交的推送还有一些工作要做,但它应该是直接的(一种方法:在每次推送的尖端放下轻量级标签,然后使用git name-rev
找到第一个标签提交后。)
大多数Gitolite用户可能只有一个与之关联的SSH密钥(keydir/user.pub
),但单个用户可能拥有多个SSH密钥(keydir/user@*.pub
)。
因此,对于基于SSH的Gitolite,您可以将每个提交映射到一个(或多个)SSH密钥。
您是否信任SSH密钥以准确识别特定的人是另一个问题(即您是否相信用户保持其私有SSH密钥安全?)。
Gitolite还可以通过“智能HTTP”缓和Git访问。在这种情况下,Web服务器在REMOTE_USER环境变量中提供Gitolite用户名(即,而不是使用.ssh/authorized_keys
文件来基于SSH密钥识别用户)。识别和身份验证完全取决于Web服务器本身(通常只是用户名和密码,但每个用户的SSL证书可用于执行更类似于基于SSH的访问)。
因此,对于基于HTTP的Gitolite,您可以将每个提交映射到Web服务器完成的身份验证。
GitHub有一些类似的信息,可以通过Events的GitHub API部分进行查询(之前它似乎只是作为您所监视的存储库的“新闻源”条目的一部分提供)。每个PushEvent标识执行推送的GitHub用户,ref(分支)的名称已更新,新ref“head”的名称(SHA1哈希)(更新分支的新提示),以及提交列表。
答案 1 :(得分:1)
这不是道德或哲学论坛,afaik; 但是
git允许签名提交和签名标记。这应该可以帮助你解决偏执狂:)
答案 2 :(得分:0)
您可以让所有人都与GPG签署提交:see this tutorial。
在教程中,GPG密码在git config中设置,这对我来说似乎是无稽之谈,因此您需要在每次提交时让钩子提示用户。
当然,如果你不是经理,建议每个人签署他们的提交都可能在外交上很难,所以要谨慎。
编辑:正如Brian指出的那样,这只会签署提交消息,所以这不是好的解决方案。我保留答案,因为它可能仍然有助于理解这个问题。