Mac下配置多个git账户

应用场景

我们经常将代码托管到github、gitlab这样的网站上。为了避免每次push代码时都要输入用户名和密码,通常会选择使用ssh协议,将公钥保存到托管网站上。在实际开发中,往往要将代码托管到多个不同的网站上,公司内部可能维护一个gitlab,内部的代码需要托管到gitlab上,自己的开源代码托管到GitHub上等等,每个托管网站都对应一个git账户。默认情况下,一台电脑的Git只对应一个账户,只能往一个网站push代码,非常不便。这篇博客将介绍如何在一个Git终端中配置多个账户,同时管理多个托管网站的代码。

初始化

首先,需要准备好对Git的全局用户进行配置。在初次安装Git时,往往会使用如下的命令配置全局用户名和邮箱:

1
2
git config --global user.name "xxx" // 配置全局用户名,如Github上注册的用户名
git config --global user.email "yyy@mail.com" // 配置全局邮箱,如Github上配置的邮箱

这个--global选项,是指这里配置的user.nameuser.email是相对于全局进行配置的,即不同的Git仓库默认的用户名和邮箱都是这个值。由于需要管理多个账户,所以仅仅使用这个全局值是不够的,需要在每个仓库中单独配置。对此,有两种处理方法:

如果之前已经使用该命令进行配置,则先使用如下命令清除

1
2
git config --global --unset user.name
git config --global --unset user.email

如果不确定是否已经配置过,可以使用下面的命令查看

1
2
git config --global user.name
git config --global user.email

配置步骤

1. 对每个账户生成一对密钥

进入保存秘钥的目录:

1
cd ~/.ssh

根据账户邮箱生成秘钥。

首先生成GitHub上通信的密钥对,例如我在GitHub上的邮箱是`gckyoogle@gmail.com`,则命令为:

1
2
# 生成公钥、密钥的同时指定文件名,Github使用
ssh-keygen -t rsa -f ~/.ssh/id_rsa_github -C "gckyoogle@gmail.com"

这里要求对秘钥进行命名,默认的文件名是id_rsa。为了方便区分,我这里命名为id_rsa_github。接下来的提示都直接进行回车,直到秘钥生成。通过ls命令,可以看到刚刚生成的密钥对id_rsa_githubid_rsa_github.pub,中id_rsa_github.pub是公钥。

然后生成GitLab上通信的密钥对,假如我在公司内部邮箱是`keyou.chen@xxx.com,按照同样的步骤生成id_rsa_gitlab`的秘钥对,命令为:

1
2
# 生成公钥、密钥的同时指定文件名,Gitlab使用
ssh-keygen -t rsa -f ~/.ssh/id_rsa_gitlab -C "keyou.chen@xxx.com"

2.私钥添加到本地

SSH协议的原理,就是在托管网站上使用公钥,在本地使用私钥,这样本地仓库就可以和远程仓库进行通信。在上一步已经生成了秘钥文件,接下来需要使用秘钥文件,首先是在本地使用秘钥文件:

1
2
3
4
# 将GitHub私钥添加到本地
ssh-add ~/.ssh/id_rsa_github
# 将GitLab私钥添加到本地
ssh-add ~/.ssh/id_rsa_gitlab

为了检验本地是否添加成功,可以使用ssh-add -l命令进行查看

3.管理本地密钥

由于添加了多个密钥文件,所以需要对这多个密钥进行管理。在.ssh目录下新建一个config文件:

1
2
cd ~/.ssh
touch config

编辑config文件,添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 网站的别名,随意取
Host github
# 托管网站的域名
HostName github.com
# 托管网站上的用户名,GitHub用户名
User ckyromgit
# 使用的密钥文件
IdentityFile ~/.ssh/id_rsa_github

# GitLab的配置与上面的GitHub类似
Host gitlab
HostName git.xxx.com
User keyou.chen
IdentityFile ~/.ssh/id_rsa_gitlab

4.公钥添加到托管网站

首先设置GitHub网站,步骤如下:

  • 访问GitHub网站,用户名密码登录
  • 点击右上方头像选择settings
  • 选择SSH and GPG keys
  • 点击New SSH key
  • 设置公钥的Title,名字可以随便取,但是最好能标识出来自哪个客户端;拷贝id_rsa_github文件中的内容粘贴到Key输入框中。
  • 点击下方的Add SSH key按钮

至此,GitHub网站的公钥添加完成,使用如下命令验证是否有效:

1
ssh -T git@github.com

之前config文件中给GitHub网站配置过别名为github,可以直接使用别名:

1
ssh -T git@github

然后配置Gitlab网站,步骤与配置GitHub相同。

使用

1.从远端拉取代码

从GitHub上克隆代码库test,操作命令为:

1
git clone git@github.com:ckyromgit/test.git

由于使用了别名gitlab,所以实际使用的复制命令应当为:

1
git clone git@github:ckyromgit/test.git

这种方法较为简单,修改后的代码无需额外配置,可以直接push

2.本地已经存在代码库

这种情况适用于本地新建的仓库需要与远端进行关联,或者之前已经使用sourceTree等图形界面软件拷贝的仓库。进入本地仓库文件夹,需要单独配置该仓库的用户名和邮箱

1
2
git config user.name "keyou.chen"
git config user.email "keyou.chen@xxx.com"

然后,进入本地仓库的git目录,打开config文件

1
2
cd .git # 该目录是隐藏的,ls命令不可见,但是可以直接进入,如果是新建的文件夹需要先执行git init
vim config

config文件中,修改(config文件中已有remote “origin”信息)或者添加(config文件中不包含remote “origin”信息)分支信息:

1
2
3
[remote "origin"]
url = git@gitlab:keyou.chen/test.git
fetch = +refs/heads/*:refs/remotes/origin/*

主要是修改url部分,原生的信息一般是`git@gitlab.com:keyou.chen/test.git`,需要将gitlab.com使用别名gitlab代替。

可以看到,仓库中的关键是要配置好用户名和邮箱,以及使用别名。使用别名的目的是为了通过别名,将本地仓库与密钥目录.ssh文件夹下的密钥进行管理,这样就完成了本地仓库使用的私钥与托管网站使用的公钥的配对,而用户名和邮箱是该仓库使用SSH协议时需要用到的信息