全局设置

在日常的学习工作中,经常需要使用Git来管理项目和代码。为了方便,很多人都会通过执行:

1
2
yee@ubuntu:~$ git config --global user.name "user"
yee@ubuntu:~$ git config --global user.email "[email protected]"

来设置全局用户信息,以免每个项目还要单独操作。

但是这样会带来一个副作用:一般来说工作代码需要使用公司账号信息,这样每当初始化工作项目的时候,务必还得修改对应设置,否则提交上去发现错了还得放开远程仓库权限做 force push ,非常麻烦。该如何解决呢?

1. Don’t guess my identity

Git的开发社群里也有相同的困扰,于是在2.8版本中增加了 user.useconfigonly 设置项来强制每个Git项目单独设置git user,避免上面所说的不小心使用个人邮箱提交公司代码的情况发生。

使用方法:

  1. 执行

    1
    2
    3
    
    yee@ubuntu:~$ git unset --global user.email
    yee@ubuntu:~$ git unset --global user.name
    yee@ubuntu:~$ git config --global user.useconfigonly true
    
  2. 在各个项目里单独设置用户信息

没有执行第2步的话 git commit 时就会报错,避免错误的提交。

2. Conditional Configurations

从2.13版本开始,Git能够通过条件设置,方便的为工作项目全局配置git user为公司邮箱,来更好的解决这个问题。

当前只能对指定git目录设置

务必确保个人设置放在公司设置前面!!

使用方法:

  1. ~/.gitconfig 全局设置文件里增加:

    1
    2
    3
    4
    5
    6
    
    [includeIf "gitdir:~/personal/"]
      path = .gitconfig-personal
    [includeIf "gitdir:~/go/src/go.company.com/"]
      path = .gitconfig-work
    [includeIf "gitdir:~/work/"]
      path = .gitconfig-work
    
  2. 添加 ~/.gitconfig-work 工作信息文件:

    1
    2
    3
    
    [user]
      name = company
      email = [email protected]
    
  3. 添加 ~/.gitconfig-personal 个人信息文件:

    1
    2
    3
    
    [user]
      name = personal
      email = [email protected]
    

通过以上设置,在 ~/go/src/go.company.com/~/work/ 目录下的项目会使用 .gitconfig-work 的配置,其它则会使用 .gitconfig-personal 的配置了。

后悔药

如果真不小心忘记修改就提交了,可以使用以下脚本修改仓库中的错误用户信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/sh

yee@ubuntu:~$ git filter-branch --env-filter '

OLD_EMAIL="[email protected]"
CORRECT_NAME="company"
CORRECT_EMAIL="[email protected]"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' -f --tag-name-filter cat -- --branches --tags

需要临时解除master保护状态,执行 git push --force