最近碰到一个比较麻烦的Git的应用场景:就是一台电脑上,可能有个git工程,每个工程的地址和账号密码又是不一样的,刚开始的就是要用那个工程了,就修改下全局的user.name,user.email,但是每次都是很麻烦,甚至会push错地方。
那么有没有办法可以在一台电脑上配置多个Git用户,不同的Push地址呢?经过查询和实验,发现是可以实现的。我就以Github来举例说明(服务器的地址都是github.com,也可以是不同的地址),如何配置多用户,多地址提交项目。首先假设有两个账号:一个Github的账号是A,另一个Github的账号是B
首先呢,我们要为不同的Github账号配置不同的Git账号
为A用户生成:
$ git config user.name "A"
$ git config user.email "[email protected]"
注意:这里git config命令没有带—global,表示这是一个局部的设置,也就是这个用户是当前项目的,而不是全局的。
为B用户配置:
$ git config user.name "B"
$ git config user.email "[email protected]"
一般的Git服务器为了安全,都会需要我们提供一个安全的SSH密钥,默认情况下,生成密钥的文件名都是一样的,但是不同的用户,必须设置不同文件名的密钥文件,否则会发生覆盖。密钥生成后,添加到服务端(如Github)
为A用户生成SSH:
$ ssh-keygen -t rsa -C “[email protected]”
运行后,会然你输入存储密钥文件的地址和密码,自己决定就行,最好是用默认的路径,然后修改下密钥文件名,类似下面的:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/lange/.ssh/id_rsa.
Your public key has been saved in /c/Users/lange/.ssh/github_id_rsa.pub.
The key fingerprint is:
SHA256:mRAluu98izlMRIQhaezphUvRHnkEH5HFm+aAX6wtXBU [email protected]
The key's randomart image is:
+---[RSA 2048]----+
| ..ooBB*o E. |
| =.=o++. . |
| o =.=o. + |
| = +.o.Bo |
| o o.+ OS |
| o .* o |
| o.. |
| ooo. |
| =o.. |
+----[SHA256]-----+
为B用户生成SSH(同样的按A的步骤,唯一不同的是密钥文件名和账户密码的不同):
ssh-keygen -t rsa -C “[email protected]”
最后会生成四个文件,在我的电脑如下:
-rw------- 1 lange staff 1679 12 18 21:13 id_rsa
-rw-r--r-- 1 lange staff 407 12 18 21:13 id_rsa.pub
-rw------- 1 lange staff 1766 1 4 21:55 lapisy_id_rsa
-rw-r--r-- 1 lange staff 404 1 4 21:55 lapisy_id_rsa.pub
注意:这里使用邮箱地址来生成的,跟用户生成Git账号的邮箱保持一致
在生成密钥的.ssh目录下,新建一个config文件,配置多账户规范,举个样例:
#github [email protected]
host github.com #别名,随便定 后面配置地址有用
Hostname github.com #要连接的服务器
User ontheroadtomine #用户名
IdentityFile ~/.ssh/id_rsa #密钥文件的地址,注意是私钥
#github [email protected]
host lapisy #别名,随便定
Hostname github.com
User lapisy
IdentityFile ~/.ssh/lapisy_id_rsa
使用ssh的ssh-add命令将密钥添加到 ssh-agent 的高速缓存中,这样在当前会话中就不需要再次输入密码了 。
$ ssh-agent bash
//A账户的私钥
$ ssh-add ~/.ssh/id_rsa
//B账户的私钥
$ ssh-add ~/.ssh/lapisy_id_rsa
添加完后,可以使用ssh-add来查看密钥列表
默认情况下,我们项目下的.git目录下,config文件的内容:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[user]
email = [email protected]
name = lapisy
[remote "origin"]
url = [email protected]:Lapisy/RecyclerViewSample.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
其中的remore地址是url = [email protected]:Lapisy/RecyclerViewSample.git,这时候,我们需要修改跟密钥对应的地址,上面在配置ssh时,为每个Hostname配置了一个host的别名,这时候,我们就不能使用原来的Hostname来提交了,要用别名来代替Hostname。如上面de
url = [email protected]:Lapisy/RecyclerViewSample.git
需要修改成对应的
url = git@lapisy:Lapisy/RecyclerViewSample.git
然后就可以正常push了。
注意:在向Github push 工程时,可能会碰到一个Bug,提示:
remote: error: GH007: Your push would publish a private email address.
remote: You can make your email public or disable this protection by visiting:
remote: http://github.com/settings/emails
To lapisy:Lapisy/RecyclerViewSample.git
! [remote rejected] master -> master (push declined due to email privacy restrictions)
error: failed to push some refs to 'git@lapisy:Lapisy/RecyclerViewSample.git'
这里需要到Github中去把邮箱设置成public,或者不让他阻止我们push,如下图:
欢迎进入到 http://blog.lapisy.com 查看更多文章