4.5 思考:随意设置提交者姓名,是否太不安全

使用过CVS和Subversion等集中式版本控制系统的用户都知道,每次提交的时候需要认证,认证成功后,登录ID就作为提交者ID出现在版本库的提交日志中。很显然,对于CVS和Subversion这样的版本控制系统而言,很难冒充他人提交。像Git这样的分布式版本控制系统,可以随心所欲地设定提交者,这似乎太不安全了。

Git可以随意设置提交的用户名和邮件地址信息,这是分布式版本控制系统的特性使然,每个人都是自己版本库的主人,很难也没有必要进行身份认证,因而也就无法使用经过认证的用户名作为提交的用户名。

在进行“独奏”的时候,还要强制为自己加上一个“指纹识别”,实在是太没有必要了,但是团队合作时授权就成为必需了。通常,团队协作时会设置一个共享版本库,在团队成员向共享版本库传送(推送)新提交时,会进行用户身份认证并检查授权。一旦用户通过身份认证,一般来说不会对提交中的包含的提交者ID做进一步检查,但Android项目是个例外。

Android项目为了更好地使用Git实现对代码的集中管理,开发了一套叫作Gerrit的审核服务器来管理Git提交,对提交者的邮件地址进行审核。例如下面的示例中,在向Gerrit服务器推送的时候,提交中的提交者邮件地址为jiangxin@ossxp.com,但是在Gerrit中注册用户时使用的邮件地址为jiangxin@moon.ossxp.com。因为两者不匹配,从而导致推送失败。


$git push origin master

Counting objects:3,done.

Writing objects:100%(3/3),222 bytes,done.

Total 3(delta 0),reused 0(delta 0)

To ssh://localhost:29418/new/project.git

![remote rejected]master->master(you are not committer jiangxin@ossxp.com)

error:failed to push some refs to 'ssh://localhost:29418/new/project.git'


即使没有使用类似Gerrit的服务,作为提交者也不应该随意改变配置变量user.name和user.email的设置,因为当多人协同时这样做会给他人造成迷惑,也会给一些项目管理软件造成麻烦。

例如,Redmine是一款实现需求管理和缺陷跟踪的项目管理软件,可以与Git版本库实现整合。Git的提交可以直接关闭Redmine上的Bug,同时Git的提交还可以反映出项目成员的工作进度。Redmine中的用户(项目成员)用一个ID作标识,而Git的提交者则用一个包含用户名和邮件地址的字符串,如何将Redmine的用户和Git的提交者相关联呢?Redmine提供了一个配置界面用于设置二者之间的映射,如图4-1所示。

4.5 思考:随意设置提交者姓名,是否太不安全 - 图1

显然,如果在Git提交时随意变更提交者的姓名和邮件地址,就会破坏Redmine软件中设置好的用户对应关系。