git: 提交前强制检查各个项目用户名邮箱设置

20 Mar 2014


保证提交日志的准确性

在提交时,user.name, user.email会进入日志。这些信息,是追踪代码变更的关键。

我们公司为了保证这些信息的准确性,在push时,强制检查,如果user.nameuser.email信息不正确,则拒绝push。

全局配置

如果我们工作中只涉及一个git服务器,用一个全局配置就可以搞定了:

git config --global user.name "huqiu.lhq"
git config --global user.email "huqiu.lhq@alibaba-inc.com"

工作在多个git项目

但是我们可能同时工作在多个项目中,公司内部用自有的git管理项目,我们在github上还有自己的项目。

对于使用不同的用户身份,需要设置不用的sshkey,具体的配置可以看这里:多个sshkey配置

这个时候,对于user.nameuser.email我们不能采用全局的配置。而是要对各个项目单独配置。

项目配置

git config user.name "huqiu.lhq"
git config user.email "huqiu.lhq@alibaba-inc.com"

忘记了做配置

对于项目配置,有时我们会忘记在git init或者git clone之后,配置user.name以及user.email

如果有全局配置,则使用全局配置。如果没全局配置,报错。

[huqiu@srain test]$ git ci -a -m 'commit for testing no user.name empty'

*** Please tell me who you are.

Run

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: empty ident name (for <huqiu@srain.localhost>) not allowed

报错能够及时纠正我们的错误,最糟糕的情况是:

  • 没有项目单独配置,提交的时候,自动采用全局配置。在发现问题之后需要对日志进行修复。

强制检查

强制检查可以在服务器端push的时候检查,也可以在客户端进行检查,这里介绍使用`pre-commit钩子进行检查。

全局钩子的配置,可以参见这里: git全局钩子

如何确定配置正确

  1. 确定没有全局配置
  2. 确定有项目配置

pre-commit hook

global_email=$(git config --global user.email)
global_name=$(git config --global user.name)

repository_email=$(git config user.email)
repository_name=$(git config user.name)

if [ -z "$repository_email" ] || [ -z "$repository_name" ] || [ -n "$global_email" ] || [ -n "$global_name" ]; then
    # user.email is empty
    echo "ERROR: [pre-commit hook] Aborting commit because user.email or user.name is missing. Configure them for this repository. Make sure not to configure globally."
    exit 1
else  
    # user.email is not empty
    exit 0
fi 

直接可用的代码

上面谈到的:

自动设置全局钩子的脚本(其中包含了这个强制检查的pre-commit钩子),并对git做一些易用配置:


欢迎关注我的微信公众号

欢迎关注我的 新浪微博,有问题随时交流。

欢迎关注我的 GitHub,了解我最新关注的项目。

comments powered by Disqus