解决同一台电脑上不同仓库不同Git账号问题
〇、基础知识
- git认证方式
- HTTPS
- 输入对应的 user 和 password
- SSH (Secure Shell)
- 使用 ssh 命令生成 RSA 密钥对,将 public key 提交到服务器,本地保留 private key。
- SSH 可以通过 config 来管理多用户
- HTTPS
- ssh目录
- mac:
~/.ssh/
,
- windwos:
C:\Users\自己的用户名\.ssh
- mac:
- 连接Github邮箱需要设置成public
一、移除全局配置
rem 查询git全局配置,如果存在,取消全局设置
git config --list
rem 移除全局配置账户
git config --global --unset user.name
rem 移除全局配置邮箱
git config --global --unset user.email
rem 移除全局密码
git config --global --unset user.password
二、创建不同user的SSH key
ssh-keygen -t rsa -f ~/.ssh/id_rsa_github -C "XXXXXXXXX@github.com"
ssh-keygen -t rsa -f ~/.ssh/id_rsa_gitlab -C "XXXXXXXXX@gitlab.com"
-t rsa
- 指定生成密钥类型(type)为 rsa 非对称加密
-f ~/.ssh/id_rsa_github
- 不指定时默认生成在ssh目录
- 如果在其他路径打开bash,自定义名字的密钥会生成在当前路径
- 指定生成密钥存放文件(file)为 SSH目录下id_rsa_github**, 该文件名可以由用户自己命名
~/.ssh/自定义文件名
,windows和mac都可以这样写
- 不指定时默认生成在ssh目录
-C "XXXXXXXXX@github.com"
- 给该密钥添加注释(comment),一般使用关联该 git 账户的 email.
- tips:
- 若没有指定
-f
,会现需要输入生成的文件名,回车默认为id_rsa和id_rsa_pub - 执行此命令后需要你输入要生成的密钥文件的口令(密码)和重复输入口令,连按回车键即可,设置密钥文件口令为空从而实现免密码登录。
- 在ssh目录下生成的密钥文件分别为
- id_rsa_* 私钥文件,本地私人使用
- id_rsa_*.pub 公钥文件,可以公开使用。
- 若没有指定
三、添加公钥到git服务器
将id_rsa.pub里面的内容添加到SSH Key中
测试SSH公钥是否生效,注意ssh默认端口为22,如果不是需要通过-p 端口号
指定端口号
ssh -T git@github.com -i ~/.ssh/id_rsa_github
ssh -T git@10.10.24.1 -p 222 -i ~/.ssh/id_rsa_gitlab
四、配置config文件
在ssh目录下找到config文件,如果没有就创建,每个账号配置一个Host节点。主要配置项说明:
User git Host # 主机别名(自定义) HostName # 服务器真实地址【域名或者ip地址】 IdentityFile # 私钥目录【windows范例:C:\\Users\\你的用户名\\.ssh\\id_rsa,mac范例:~/.ssh/id_rsa】 PreferredAuthentications # 认证方式
配置文件内容:
# github User git Host github HostName github.com # win配置 IdentityFile C:\\Users\\XXXXXXX\\.ssh\\id_rsa_github # mac配置 # IdentityFile ~/.ssh/id_rsa_gitlab PreferredAuthentications publickey # gitlab User git Host gitlab.com HostName 10.10.24.1 Port 222 # win配置 IdentityFile C:\\Users\\XXXXXXX\\.ssh\\id_rsa_gitlab # mac配置 # IdentityFile ~/.ssh/id_rsa_gitlab PreferredAuthentications publickey
测试私钥是否生效, 注意:@ 符号前后的参数要与上面 User 和 Host对应上
ssh -T git@github.com ssh -T git@gitlab.com -p 222
tips:
- 如果出现了SSH连接需要密码的情况,修改为和HostName一样后解决。
参考
五、其他配置
为每一个项目设置不同的用户名和邮箱
cd 项目/.git
git config user.name "xxx"
git config user.email "xxx@example.com"
六、问题
~/.ssh
目录配置gitlab之后,导致shell无法通过ssh登陆修改gitlab配置文件的host值,设置为自定义的名称「这个会修改gitlab仓库生成的ssh地址」
cd /opt/gitlab/embedded/service/gitlab-rails/config vi gitlab.yml
在config文件的gitlab的host后面也配置为自定义的名称。
这样是shell通过ip登陆,gitlab通过指定的host名字登陆
如果原先使用HTTPS通信,则需要修改远程仓库地址
git remote rm origin git remote add origin git@user1.github.com:xxx/xxxxx.git
待验证
- 使用的是 IDEA,比如 AS,还需要设置 SSH 使用本地(native)的客户端,而非 AS 内嵌(build in)的 SSH 客户端
- Mac,可能会遇到升级系统或者重启系统之后,SSH私钥失效的问题
- ssh agent
- ssh-agent 会话是一个临时的会话,在终端退出后也随之结束