唠唠闲话

最近发现用校园网克隆 Github 仓库太慢了,在知乎上搜索,发现用 Gitee 作为中介可以加快速度,所以写了这篇博客整理方法。本篇介绍一台电脑上使用多个 git 托管平台的方法,可用于解决 Github 仓库使用 git clone 太慢的问题点这里跳转)。

由于本地 Git 仓库和 GitHub 仓库之间的传输通过 SSH 加密,教程主要针对密钥的设置问题。

参考链接:
廖学峰网站:Git教程
简书:多个github帐号更新多个hexo博客
CSDN:在一台电脑上同时使用多个github账号

注:参考的教程大多提到用 git config --global --unset user.name/email 取消全局设置,但这步不做也没影响。主要因为设置的账号都是一个人在用,所以全局设置同一个用户在提交。

基本设置

假定本地 Git 需要连接三个账号:Github1, Github2, Gitee

  1. 全局设置账号和邮箱

    1
    2
    git config --global user.name "用户名"
    git config --global user.email "邮箱"

    如果是多个账号在用,使用 git config --global --unset user.name/email 取消全局设置

  2. 生成密钥:进入主目录,清理并生成 ssh 密钥

    1
    2
    3
    4
    5
    6
    7
    cd ~/.ssh # 进入 .ssh 目录,如果不存在,先用 mkdir ~/.ssh 新建
    ssh-add -l # 查看 ssh 列表
    ssh-add -D # 清理本地 ssh 缓存
    ### 生成三组密钥 ###
    ssh-keygen -t rsa -C "youremail@xx.com" -f Github1_rsa
    ssh-keygen -t rsa -C "youremail@xx.com" -f Github2_rsa
    ssh-keygen -t rsa -C "youremail@xx.com" -f Gitee_rsa

    注:-f 参数设置密钥名称,默认为 .ssh/id_rsa ,过程提示是否设置密码,按两次 Enter 跳过即可;键入代码后,.ssh/ 目录下生成了私钥 xxx_rsa 和公钥 xxx_rsa_pub

  3. 添加密钥:如果取消了全局配置,需将私钥加到 ssh

    1
    2
    3
    4
    5
    eval $(ssh-agent -s) # 打开ssh-agent
    ssh-add ~/.ssh/Github1_rsa
    ssh-add ~/.ssh/Github2_rsa
    ssh-add ~/.ssh/Gitee_rsa
    ssh-add -l # 查看密钥列表
  4. GitHub 设置:登录账号,点击头像 -> setting -> SSH and GPG keys -> New SSH key,如下图
    github ssh key

    title 任取,打开前边生成的公钥 .ssh/xxx_pub ,将内容复制到 key
    ssh key

    注意:复制的是公钥文件 xxx_pub 。

  5. Gitee 的操作类似,点击头像 -> 设置 -> SSH 公钥 -> New SSH key

  6. 配置密钥:在 .ssh/ 目录下,生成配置文件 config, 填写密钥信息。

    1
    code config # 使用 VScode 编辑文件

    配置文件 config 内容如下(参考)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # Github1
    Host Github1.github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/Github1_rsa

    # Github2
    Host Github2.github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/Github2_rsa

    # Gitee
    Host gitee.com
    HostName gitee.com
    User git
    IdentityFile ~/.ssh/Gitee_rsa
  7. config 内容说明,三部分对应三个账号:

    • Host 为命令行访问地址
    • HostName 为实际访问地址
    • User 为用户名
    • IdentityFile 后接密钥的路径

连接测试

  1. Github/Gitee 密钥设置后,在本地输入下边代码连接测试

    1
    2
    3
    ssh -T git@Github1.github.com
    ssh -T git@Github2.github.com
    ssh -T git@gitee.com
  2. 显示如下内容,输入 yes 确认

    1
    2
    3
    4
    The authenticity of host 'github.com (13.229.188.59)' can't be established.
    RSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    Warning: Permanently added 'github.com,13.229.188.59' (RSA) to the list of known hosts.
  3. 若连接成功,会受到类似下边的信息,其中 UserName 为账号用户名。

    1
    Hi *UserName*! You've successfully authenticated, but GitHub does not provide shell access.

    连接成功后 .ssh 目录下会出现新文件 known_hosts;如果连接失败,会显示 git@xxx: Permission denied (publickey).

注:Linux 下如果用 sudo 搭建 hexo 博客,连接仓库时 ssh 密钥检索的是 root 目录,此时还需要将 .ssh 复制过去。

1
2
sudo su # 进入管理员权限
cp /home/UserName/.ssh /root/ # UserName 为计算机名(用户目录名)

git clone 加速

国内访问 Github 仓库有时候太慢,网上搜索了许多方案,发现最简单方式还是用国内的 Gitee 作为媒介,将仓库克隆到本地再重新链接。

参考知乎:git clone github项目过慢的解决办法

  1. 授权码云

    • 注册 Gitee (码云)的账号
    • 点击新建仓库 -> 从其他网站导入 -> Github 授权
    • 授权一次,以后就能在列表中看到自己中账号中的仓库。
    • 选择需要相应仓库,导入 Gitee。
  2. 克隆仓库
    使用 git clone git@gitee.com:UserName/reponame.git 克隆相应仓库。

  3. 更改远程连接

    1
    2
    3
    4
    5
    6
    7
    8
    9
    cd ./reponame # 进入 git 仓库
    git remote -v # 查看远程连接,显示如下,远程为 Gitee 仓库
    # origin git@gitee.com:UserName/reponame.git (fetch)
    # origin git@gitee.com:UserName/reponame.git (push)

    git remote remove origin # 取消与 Gitee 的连接
    git remote add origin git@github.com:UserName/roponame.git # 连接原先的 Github 仓库
    git pull master origin # 更新本地仓库
    git push -u origin master # 推送到远程仓库,-u 设置推送的默认分支

注:如果是多账号,这里 git remote add origin 后的链接要按 config 文件的 Host 进行修改。

多分支操作

  1. 克隆所有分支,参考:How do I fetch all Git branches?

    1
    2
    3
    4
    ```bash
    git branch -r | grep -v '\->' | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
    git fetch --all
    git pull --all
  2. 推送所有分支:

    1
    git push --all