Git使用之一台机器管理多个代码托管平台
需求背景
我们在一台开发机器上,会遇到想要管理公司自建仓库和Github这样多个代码托管平台的场景。
通常我们在网上学习到的配置是系统账号下的全局配置,可以拉取平台A的代码就没办法继续拉取平台B的代码了。此文提供了两种解决方案。
两种解决方案
- 多个平台都使用同一个邮箱进行注册,然后配置的
SSH
密钥可以支持我们在多个平台上进行代码管理。 - 多个平台且拥用多个不同邮箱账号注册时,需要告知SSH指定使用特定的的密钥文件进行访问(本文重点讲解)。
准备如下
使用 ssh-keygen -r rsa -C '你的邮箱'
进行密钥对生成。生成后大致位置在/home/account/.ssh
下。具体文件目录要看你的账号。生成过程中你也可以指定目录和生成的文件名。本文准备的材料如下。
- 账号
账号[email protected]
- 账号
账号[email protected]
- 生成的密钥对文件树如下所示
/root/.ssh
|-- /root/.ssh/config
|-- /root/.ssh/gitee
|-- /root/.ssh/gitee.pub
|-- /root/.ssh/id_rsa
|-- /root/.ssh/id_rsa.pub
|-- /root/.ssh/known_hosts
`-- /root/.ssh/known_hosts.old
你将学习到
Git的三级别配置
网上大多数以git config global user.email "你的邮箱"
为开头,然后配合上ssh-keygen
命令一步一步引导直到项目clone
到本地。但其实这里包含了两个知识点。前者是git
项目配置,后者是ssh
登录配置。
三个级别
- 仓库级别:针对项目配置,一般在++项目根目录++
./git
中配置。 - 全局级别:针对单个用户的全部仓库配置生效。优先级低于仓库级别。我们可以配置多个账号。于
~/.gitconfig
或~/.config/git/config
中配置。 - 系统级别:针对机器上全部仓库和用户生效。优先级低于全局级别。于
/etc/gitconfig
中配置。
如何设置
- 通过
git config --global user.email "你的邮箱"
命令配置当前系统登录账号下的git用户信息配置(全局配置) - 通过`git config user.email “你的邮箱” 完成系统级配置。
- 通过`git config --local user.email “你的邮箱” 完成项目级配置。
- 通过
git config [null|--local|--global] user.email
可以查看相应级别的用户配置。
它的作用
- 仅是用于提交代码时,保存你的
昵称
和联系
方式这样的信息。 昵称
是user.name
,联系方式
是user.email
。在代码的commit
记录中可以看到。
SSH 登录不同代码平台实现代码管理
.ssh/config
这个文件是SSH登录过程中重要的选择依据。下面是博主的一份配置仅供参考。
Host github.com
User git
IdentityFile /root/.ssh/id_rsa
IdentitiesOnly yes
Host gitee.com
User git
IdentityFile /root/.ssh/gitee
IdentitiesOnly yes
当我们在执行git clone [email protected]/你的账号:你的私人代码库
命令时SSH 会自动匹配host
配置使用私钥/root/.ssh/id_rsa
做身份验证。同理在拉取码云gitee
的项目时也会自动使用另外一份密钥/root/.ssh/gitee
。
至此我们完成了在一台机器上使用不同账号拉取不同代码托管平台的诉求。
实验结果如下
/data
|-- gitee
| `-- geektutu
| |-- Day2
| |-- Day3
| |-- Day4
| |-- LICENSE
| `-- README.md
`-- github
`-- note
`-- README.md
怎么配置SSH
- 使用
ssh-keygen -t rsa -C '[email protected]'
生成不同账号的密钥并区分名字。 - 对于Github来说,你需要登录GIthub并且进入个人主页,找到 Settings -> SSH and GPG keys -> New SSH key 将你的 .ssh/xxx.pub 文件内容贴上去。
- 对于Gitee来说,难不倒你,自行研究。
更多拓展
以 http
的方式克隆项目,例如github项目
root@438aedd211ea:/data/http# git clone https://github.com/lv997/note.git
Cloning into 'note'...
Username for 'https://github.com': tty199
Password for 'https://[email protected]':
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lv997/note.git/'
使用 http 克隆项目会被要求输入你的账号和密码,但是Github 于2021年8月13日停止支持使用账号密码拉取私人仓库,因此上面的克隆显示失败。取而代之的是使用token
的方式替代。克隆命令如:
git clone https://x-access-token:[email protected]/your-username/your-repo.git
关于私人token的申请,参考其它文章。下面是使用私人token下载私人项目的例子。
git clone https://x-access-token:[email protected]/lv997/note.git/
Cloning into 'note'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (4/4), done.
root@438aedd211ea:/data/github# ls
note
对比 http 和 ssh 两种克隆方式
HTTP方式
- 认证方式:通常使用用户名和密码进行认证,或者使用个人访问令牌(Personal Access Token)。
- 安全性:数据传输过程可以使用HTTPS进行加密,但默认情况下可能不如SSH安全。
- 速度:HTTP克隆和推送的速度通常比SSH慢,因为它支持更多的网络请求类型。
- 配置:相对简单,只需在GitHub账户中生成个人访问令牌,并在克隆或推送时使用该令牌即可。
- 使用场景:适合对网络安全性要求不是特别高的场景,或者是那些对SSH协议有限制的网络环境。
SSH方式
- 认证方式:使用SSH密钥对进行认证。用户需要在本地生成一对密钥(公钥和私钥),并将公钥添加到GitHub账户中。
- 安全性:SSH提供了一种更为安全的认证方式,因为它基于密钥而不是密码。数据传输过程是加密的,相对更安全。
- 速度:通常比HTTP快,尤其是在网络速度较慢的情况下。
- 配置:配置稍微复杂一些,需要生成和管理SSH密钥,并将公钥添加到GitHub账户。
- 使用场景:适合需要频繁操作仓库,或对安全性有较高要求的场景。
额外的参考.ssh/config参考例子
Host github
HostName github.com
User your_git_hub_name
IdentityFile ~/.ssh/github_rsa
PreferredAuthentications publickey # 意思是使用公钥和秘钥进行权限校验
Host gitlab
HostName https://gitee.com/lvtaiyu
User your_git_hub_name
IdentityFile ~/.ssh/gitee_rsa
PreferredAuthentications publickey