迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 操作系统 >

git remote 操作——一个项目多个远程仓库

作者:迹忆客 最近更新:2021/09/07 浏览次数:

一个git项目多个远程仓库


在我们的git项目中,操作远程仓库信息的命令为

$ git remote  # 查看当前所有的远程仓库的名称
$ git remote -v # 查看远程仓库的名称和远程仓库的网址

一般情况下,当我们从远程仓库中克隆下一个项目来之后。默认的远程仓库名是 origin

$ git clone https://github.com/onmpw/JYGO.git
$ cd JYGO
$ git remote
origin

$ git remote -v
origin https://github.com/onmpw/JYGO.git (fetch)
origin https://github.com/onmpw/JYGO.git (push)

pull 或者 push 的时候默认使用的都是origin远程仓库

$ git pull origin master # 或者 git pull

$ git push origin master # 或者 git push

怎么给这个项目再添加一个远程仓库呢?使用git remote add 命令。

方法一、 git remote add


$ git remote add local git@localhost:workspace/repo/JYGO2.git

上面的localorigin一样,也是远程仓库的名称

$ git remote -v
origin https://github.com/onmpw/JYGO.git (fetch)
origin https://github.com/onmpw/JYGO.git
local git@localhost:workspace/repo/JYGO2.git (fetch)
local git@localhost:workspace/repo/JYGO2.git (push)

添加成功之后,以后再使用git push的时候,就可以根据需要推送到需要的远程仓库中。如果需要推送到两个仓库中,则执行两边 git push

$ git push origin master # 默认的origin远程仓库
$ git push local master  # 新添加的 local 远程仓库
To git@localhost:workspace/repo/JYGO2.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@localhost:workspace/repo/JYGO2.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

puah没有成功!怎么会出现这种情况呢。原来在使用git remote add 添加完远程仓库之后,其实是不能直接推送到远程仓库的。也就是说开始的时候,上面第二条命令是执行不成功的。因为这时候你本地的版本和local远程仓库的版本是不一致的,需要从local上获取最新的代码。也就是说在执行 push 之前需要先从local上拉取最新的内容。

$ git pull local master
Unpacking objects: 100% (3/3), done.
From git@localhost:workspace/repo/JYGO2.git
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> github/master
fatal: refusing to merge unrelated histories

是的,仅仅使用上面的命令也是不会成功的。需要使用下面的命令

$ git pull --allow-unrelated-histories local master

顺利执行成功。然后再使用 push 就可以推送到远程仓库了。

$ git push local master

成功了。 很好。不过问题也随之而来了。如果有多个远程仓库都需要提交,那我们要每个远程仓库都执行一次 git push。有没有一种方法一次push就提交到多个远程仓库呢?答案当然是:这个真有!

方法二、 git remote set-url --add 命令


$ git remote set-url --add origin git@localhost:workspace/repo/JYGO2.git

上面命令就是给远程仓库origin 再新增一个远程仓库的地址。网上有很多文章写到这就认为,添加完成之后就可以直接使用 git push 命令一次性提交到多个远程仓库了。其实不然,最初始的那个远程仓库push成功是没问题的。但是到了新增的这个地址的时候就会出现推送失败的情况。

$ git push --all # 或者 git push origin master 或者直接使用 git push, 都可以。
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 931 bytes | 931.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To https://github.com/onmpw/JYGO.git
   c1857d1..ff94cf0  master -> master
To git@localhost:workspace/repo/JYGO2.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@localhost:workspace/repo/JYGO2.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

很明显,还是因为本地和远程版本不同步的问题。也就是说在push 之前需要先 pull 内容。

$ git pull 
Already up to date.

很奇怪,已经是最新的内容了。但是新添加的远程仓库并没有获取过。 其实问题的原因是在同一仓库名称下如果有多个远程仓库地址的话,pull 的时候只会去第一个仓库地址中拉取内容。所以说,我们新添加的远程仓库的内容是不会被获取到的。也就是不能push的。 那这个问题要怎么解决呢?很简单,换成第一种方法,使用 git remote add 来添加远程仓库,从而进行管理。但是,push的时候是比较麻烦。 有没有其他的方法呢?答案还是:这个真有。

1. 修改配置文件 .git/config

首先,我们知道不管是 git remote add 还是 git remote set-url --add 其实都是来操作项目中的.git/config配置文件(有兴趣可以去看一下该配置文件的内容)。对于 git remote set-url --add 来说,config配置文件的主要部分内容如下

[remote "origin"]
        url = https://github.com/onmpw/JYGO.git
        fetch = +refs/heads/*:refs/remotes/github/*
        url = git@localhost:workspace/repo/JYGO2.git

看到内容了吗,很简单明了。既然pull只是获取第一个远程仓库的内容,那还不好说吗,直接交换二者的位置,改动如下

[remote "origin"]
        url = git@localhost:workspace/repo/JYGO2.git
        fetch = +refs/heads/*:refs/remotes/github/*
        url = https://github.com/onmpw/JYGO.git

然后再使用git pull

这里需要注意的是,使用git pull的时候,和第一种方法是一样的,也要加上 --allow-unrelated-histories 参数

$ git pull
$ git push --all

很开心,终于成功了。

2. 空仓库方法

这种方法很简单。既然内容版本不同步,那就不要有内容。我们新添加的远程仓库要是一个空仓库,不要有任何的文件内容。 网上有人说是因为README.md 文件的问题。其实只是说对了一半。因为在github或者gitlab等平台上,新建仓库的时候可能有些会默认初始化一个README.md文件。像github在新建仓库的时候是会让你选择是否初始化README.md文件的,我们只要不初始化这个文件就行了。当然除了这个默认文件。在我们将这个远程仓库加到我们项目中之前,该仓库中就不要有任何的文件了。只有这样,当我们将远程仓库加到项目中之后才不需要pull就可以直接推送本地内容到该远程仓库了。

总结: 对于上面涉及到的这些命令的使用,在我们git 教程中有很多细节的说明,在使用的过程中可以去参考相应的用法。这里就不多做没用的赘述了。

除非注明转载,本站文章均为原创或翻译,欢迎转载,转载请以链接形式注明出处

本文地址:

迹忆客

专注技术分享,项目实战分享!

技术宅 乐于分享 7年编程经验
社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

热门文章

教程更新

热门标签

git