git remote远程仓库管理及多仓库配置

由于各种原因(需要同时使用多个仓库平台,例如:github存放一些个人代码和企业gitlab存放公司业务代码; 或者公司内多个内网不同的gitlab平台需要实现项目代码同步),因此经常会遇到我们需要同时访问多个git托管平台。手动拷贝粘贴变动文件显然是不符合我们慵懒策略的,可以自动通过不同的域名(IP)调取对应的密钥进行数据的访问,git仓库实现多远程仓库配置实现本地单仓库管理多远程仓库的功能,极大的提高我们的效率。为了满足业务场景,查了一些方案,在此进行记录。

remote

因为关注到remote,可能大多数人已经有了多远程仓库的配置需求,所以在这里先介绍多仓库的配置,在补充介绍其他相关命令

常用命令

查看远程仓库配置

1
2
3
4
5
6
$ git remote   # 查看所有远程仓库的别名:
origin # origin是默认命名,当我们clone一个仓库时,git会默认给它命名为origin。

$ git remote -v # 查看所有远程仓库的别名和对应的URL:
origin ssh://git@gitlab.xxx.cn/git-demo.git (fetch)
origin ssh://git@gitlab.xxx.cn/git-demo.git (push)

添加远程仓库

1
2
3
4
5
6
7
8
9
10
11
12
# 添加远程仓库
$ git remote add <name> <url>
# name是我们为这个新仓库取的一个别名
# url是这个新仓库的具体地址

# 重命名远程仓库
$ git remoet rename <old-name> <new-name>

# 删除远程仓库
git remove <name>

# 添加多个远程仓库

多仓库的配置

因为本文主要是针对多仓库,所以全局配置显然已经不合适了,多仓库的账号往往不互通,所以首先我们再本地进行多个账号的配置。

配置多个账号

  • 首先针对我们每个不同的托管平台账号生成各自的密钥信息。以gitlab & github为例。

    1
    2
    3
    ssh-keygen -t rsa  -f ~/.ssh/id_rsa_gitlab -C "gitlab@account" 

    ssh-keygen -t rsa -f ~/.ssh/id_rsa_github -C "github@account"
  • 生成密钥后,在密钥存储目录创建~/.ssh/config文件并进行相关信息的记录,config文件格式如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # github
    # host 与 hostname 需要相同
    Host github.com
    HostName github.com
    # 你的github账号
    User github@account
    # github对应的rsa秘钥文件
    IdentityFile ~/.ssh/id_rsa_github

    # gitlab
    # host 与 hostname 需要相同
    Host gitlab.genomics.cn
    HostName gitlab.genomics.cn
    # 你的gitlab账号
    User gitlab@account
    # gitlab对应的rsa秘钥文件
    IdentityFile ~/.ssh/id_rsa_gitlab

完成上述步骤后,分别将不同托管平台对应生成的秘钥文件信息添加到对应平台中,例如:
gitlab中添加方式: Edit profile ==> SSH key ==> Add an SSH key ;
github中添加方式:Settings ==> SSH and GPG keys ==> New SSH key。
然后就可以直接对多个不同托管平台的数据进行操作,而不用每个仓库单独配置账号和权限了。

仓库远程关联

弱关联配置

所谓弱关联,其实就是本地和远程代码不是强相关,可以指定代码推送到那个远程仓库,不同的远程仓库代码也可能存在版本差异,这样会有更多的可操作性,自由度和安全度也更高。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ git remote -v # 查看关联的远程仓库
origin https://github.com/Ben-unbelieveable/Ben-unbelieveable.github.git (fetch)
origin https://github.com/Ben-unbelieveable/Ben-unbelieveable.github.git (push)

# git remote add <name> <url>添加一个远程仓库 name 值请确保唯一性,方便区分
$ git remote add gitlab ssh://git@gitlab.********.cn:2200/li****/ben-unbelieveable.github.git

git remote -v # 查看关联是否成功
gitlab ssh://git@gitlab.genomics.cn:2200/liubo4/ben-unbelieveable.github.git (fetch)
gitlab ssh://git@gitlab.genomics.cn:2200/liubo4/ben-unbelieveable.github.git (push)
origin https://github.com/Ben-unbelieveable/Ben-unbelieveable.github.git (fetch)
origin https://github.com/Ben-unbelieveable/Ben-unbelieveable.github.git (push)

# 向特定仓库推送代码
$ git push origin master
$ git push gitlab master

# 从特定仓库拉取代码
$ git pull origin master
$ git pull gitlab master

其实以前用git 经常看到origin,但是直到现在才知道origin 是默认的远程仓库别名,所以可以随意添加远程仓库并起别名进行区分,例如:gitlab。

强关联配置

但是显而易见的,弱关联请胯下,我们每次 push 都需手动指定远程仓库,显得比较麻烦.有写项目,仓库我仅仅需要一次操作同步至 github 和 gitlab 即可, 只可以多仓库同步推送,但是不能多仓库同步拉取流程,当然也可能是为了规避可能的代码冲突。

1
2
3
4
5
6
7
# git remote set-url --add <name> <url> 为当前仓库添加额外的远程地址
$ git remote set-url --add origin ssh://git@gitlab.********.cn:2200/li****/ben-unbelieveable.github.git

$ git remote -v
origin https://github.com/Alioth996/txt-reader.git (fetch) # git fetch/pull 时的默认仓库
origin https://github.com/Alioth996/txt-reader.git (push)
origin git@gitlab.com:alioth-code/txt-reader.git (push)

当然如果我们默认拉取的仓库不是origin的仓库,我们也可以更改remote的默认(origin)配置,默认每个remote的第一个配置的远程仓库是由拉取权限的,后续添加的仓库可以推送。

-------------本文结束感谢您的阅读-------------