协议
Git 可以使用的 4 种协议
- HTTP 协议
- SSH
- 本地协议
- Git 协议
普遍使用的则是 HTTP 和 SSH,说一说这两种方式的优缺点。
HTTP
优点
- 相同 URL(同一个 URL,仓库地址、clone 和 push 都是相同地址 例如: GitHub 上的仓库)
- 使用简单(只在需要授权时提示输入用户名/密码)
- 既可以设置无授权匿名服务,也可以传输时授权和加密
缺点
- 架设 HTTP/S 协议会比 SSH 麻烦一些
- 授权比较麻烦(需要频繁输入账号密码,当然 Git 也提供有缓存功能)
SSH
优点
- 普遍(大多数服务器已支持 SSH 访问,即使没有也很容易架设)
- 安全(数据传输要经过授权和加密)
- 高效(传输尽量压缩数据)
缺点
- 不能匿名访问,不利于开源项目(即便只要读取数据,也要有通过 SSH 访问主机的权限)
使用 SSH
SSH 密钥可以让用户无需输入密码即可登录到 SSH 服务器中。SSH 密钥总是成对出现(公钥和私钥)
使用流程
- 生成密钥对
- 将生成的公钥添加到服务器
- 测试连接
SSH 连接的时候,远程服务器向用户发送一段随机字符串,用户使用对应的私钥加密后,再发送到远程主机。
远程主机使用公钥进行解密,如果成功证明用户是可信的。这一过程不需要用户手动操作。
生成密钥对
1 | $ ssh-keygen |
选项
- -t 可选 指定加密算法,默认 RSA
- -b 可选 生成密钥长度
- -C 可选 添加密钥对的说明(你可以随便输入内容)
- -f 可选 指定生成私钥文件名,不使用 -f 会在创建过程中会提示用户输入
- -P 可选 指定 passphrase 使用私钥时的密码 passphrase 至少 5 个字符
- -p 可选 修改 passphrase
私钥默认名称为 id_ + 算法名称
私钥对应的公钥名称为 私钥文件名 + .pub
ssh-keygen
不添加任何选项生成过程中
第一次提示用户输入是保存密钥的文件名,直接回车使用默认值。
第二次提示用户输入 passphrase ,passphrase 是一个密码(使用私钥时的密码,使用后会在每次 pull、push 等操作中验证 passphrase)不使用可直接回车。
第三次提示用书再次输入 passphrase。
完成后 ~/.ssh
目录下会多出两个文件 id_rsa
、id_rsa.pub
。
将生成的公钥添加到服务器
GitHub: Settings
> SSH and GPG keys
> New SSH key
将上一步生成的 .pub
的公钥内容复制到 Key 中,Title 随便填,添加即可。
测试连接
公钥添加到 GitHub,可以使用 SSH 测试 GItHub 连接,没有问题会输出欢迎语句。
1 | $ ssh -T git@github.com |
如果出现了下面的问题 (了解更多)
1 | $ ssh -T git@github.com |
1 | $ git clone git@github.com:jingchaocheng/git.git |
解决方法
在 ~/.ssh/
目录下 config
(如果没有新建一个)文件中添加下面内容后,再次测试链接。
1 | Host github.com |
同一设备多个 Git 托管服务
场景:公司内工作开发使用 GitLab,自己瞎折腾用的 GitHub、Gitee(即便每个平台注册的邮箱号不同也可以)。
使用方法:将之前生成的公钥添加到各个 Git 托管服务中即可。
需注意各个平台上的用户名和邮箱是否和本地的 git config 中的内容一致,如需修改参考下面的配置用户信息。
同一设备两个 GitHub 账号
场景:有两个不同的 GitHub 账号,想在同一台电脑上使用。(同理可解决 两个 GitLab 账号、两个 Gitee 账号问题在同一设备使用的问题)。
公钥在同一个托管平台上具有唯一性,所以同一平台的多个账号不能使用同一公钥,这种情况需要生成多个密钥使用,每个账号对应一个密钥对。
在同一个平台上多个账号添加同一个公钥的错误提示
GitHub
Gitee
再次生成一对密钥
1 | ssh-keygen -f 996 |
这个时候 ssh 目录下应该有两对密钥 4 个文件
新建 config 文件,添加以下内容
1 | # 使用 id_rsa 密钥的 |
每个配置区段使用 Host
来区分, IdentityFile
指定私钥文件路径
将两个公钥的内容分别添加到两个账号的 SSH keys
中
使用 config
文件中第一个 Host
配置时和之前一样。
1 | git clone git@github.com:jingchaocheng/git.git |
使用 config
文件中使用第二个 Host
配置
1 | git clone git@996:996-vip/git.git |
这样就完成了在同一设备同时使用两个 GitHub 账号的设置,记得配置 clone 仓库的用户信息。两个账号的用户信息必定不相同。
配置用户信息
Git 配置文件存储在三个不同位置,有相同配置时下级覆盖上级。
示例
1 | # 当前用户 |
每一次 Git 的提交都会使用这些信息,并写入到每一次提交中。提交记录中的 Author 就是取的配置文件中的 user.name
和 uesr.email
。所以都修改成当前仓库的 git config 的用户名和邮箱与目标托管平台中的用户名和邮箱一致即可。