github多帐号

多github帐号的ssh key切换

我有两个github帐号,一个是个人所用,一个是为公司项目所用。如果是单用户,很方便,默认拿id_rsa与你的github服务器的公钥对比;如果是多用户如user1,user2, 那么就不能用在user2的身上了,这个时候就要配置一下了

配置多个ssh key

来源:多github帐号的SSH key切换

新建user2的SSH Key

如何生成ssh密钥,可以参考 generating-ssh-keys

# 新建SSH key:
ssh-keygen -t rsa -P "" -f ~/.ssh/<new_id_rsa> -q
# -P "": 密码为空
# -f ~/.ssh/<密钥名字>: 生成的私钥路径,相应的共钥为 私钥路径.pub
# -q:  Silence ssh-keygen

于是~/.ssh/下会生产私钥<密钥名字>和公钥<密钥名字>.pub, 请勿泄露私钥内容

配置ssh config

~/.ssh/config文件修改如下

# 默认github账号(github.com:user1), <github-user1别名>是服务器的alias
Host github.com <github-user1别名>
    HostName github.com
    User git
    IdentityFile ~/.ssh/<user1密钥名字>

# github账号2(github.com:user2),<github-user2别名>是服务器的alias
Host <github-user2别名>
    HostName github.com
    User git
    IdentityFile ~/.ssh/<user2密钥名字>

# gitlab
Host gitlab
    hostname gitlab.widget-inc.com
    User <gitlab用户名>
    Port 65422
    IdentityFile  ~/.ssh/<gitlab密钥名字>

# oschina
Host oschina
    hostname git.oschina.net
    User <oschina用户名>
    IdentityFile  ~/.ssh/<oschina密钥名字>
  • IdentityFile填私钥的路径,而非公钥的

添加公钥

打开新生成的``/.ssh/<user2密钥名字>.pub`文件,将里面的内容添加到GitHub网站上,user2的设置里

测试连接

若如下返回,则测试成功,两个密钥均可用

ssh -T <github-user1别名>
# 或
ssh -T git@github.com
# Hi <user1密钥名字>! You've successfully authenticated, but GitHub does not provide shell access.

ssh -T <github-user2别名>
# Hi <user2密钥名字>! You've successfully authenticated, but GitHub does not provide shell access.

多ssh key的git免密pull/push

git push/pull要想免输入github的用户名和密码,本地仓库关联的远程仓库 之url不能是https的,需必需是git@github.com的,这样才能走ssh协议,调用~/.ssh/config下的密钥进行免密登录。

多个本地git帐号配置用户名与邮箱

参考

# 设置global的用户名,设置为github的默认用户
# "<user1>"是github用户名,"<user1-email>"是github注册邮箱
git config --global user.name "<user1>"
git config --global user.email "<user1-email>"

# 或修改~/.gitconfig
[user]
    name = <user1>
    email = <user1-email>

# -----
# 设置仓库的user.email和user.name, 设置为github的非默认用户或修改
# "<user2>"是github用户名,"<user2-email>"是github注册邮箱
git config user.name "<user2>"
git config user.email "<user2-email>"

# 或修改./.git/config
[user]
    name = <user1>
    email = <user2-email>

github 仅通过 user.email 来识别提交的commit是哪个github用户交的。

因此,对于非默认用户用户设置需要注意:

  • "<user1>", "<user2>" 不强制填github用户名,这不会影响github识别用户,但依然建议填成github用户名,以便本地 git log --format="%ae"%ae表示显示user.email)显示与github用户名一致。
  • "<user1-email>", "<user2-email>" 必需填github上的注册邮箱。
  • 如果不配"<user2-email>", github虽然能接收push,但会在github页面上显示是全局用户<user1>交的。
  • 如果"<user2>" 填github用户名,而"<user2-email>" 填假邮箱,则可实现匿名,代价是github无法识别出是<user2>提交的commit。

git免密pull/push设置方法

git clone创建

# 对于默认github账号 user1
git clone git@github.com:<github用户名>/<github的repo名>.git
# 对于其他github账号 user2
git clone <github服务器别名>:<github用户名>/<github的repo名>.git

本地repo设置远程仓库

# 对于默认github账号 user1
git remote add git@github.com:<github用户名>/<github的repo名>.git
# 对于其他github账号 user2
git remote add <github服务器别名>:<github用户名>/<github的repo名>.git

无法免密pull/push设置方法怎么办

需将本地repo文件夹下 .git/config中的远程仓库的url,从https的改为git@github.com

  • 见https的url:
[remote "origin"]
    url = https://github.com/<github用户名>/<github的repo名>.git

它是从github上这里复制的

  • 修改为git@github.com的:
[remote "origin"]
    url = git@github.com:<github用户名>/<github的repo名>.git

它从github上这样复制

多github账号的免密git pull/push

上述url还可以写成

[remote "origin"]
    url = <github服务器别名>:<github用户名>/<github的repo名>.git

<github服务器别名>例如”github2”,这样就能实现多github账号的免密push/pull

git用户名

查看用户名

git config user.name
git config user.email

设置用户名

git config user.name "你的用户名"
git config user.email "你的邮箱"