推送Git项目到多个远程仓库

最近一直在学习和使用Git作为版本控制系统,并同时使用GitHubCoding作为自用项目的远程仓库来托管代码。自从Google被墙后,心里就对使用域外的互联网服务产生了阴影,总担心有一天GitHub也会被墙,所有就萌生了是不是可以把自己本地代码同时推送到两个远程仓库的想法,这样可以在一次commit and push把自己的代码同时推送到GitHub和Coding。于是经过一翻Google(没错,就是Google你没有看错)和摸索,终于得偿所愿,现在把自己的做法分享一下。

选择SSH克隆远程仓库

虽然GitHub官方推荐使用HTTPS URLs:

The https:// clone URLs are available on all repositories, public and private. These URLs work everywhere–even if you are behind a firewall or proxy.

但还是强烈推荐实用SSH的方式来完成和远程仓库连接过程中的认证,这样不用每次都输入用户名和密码(如果你有更好办法,欢迎留言),变的十分方便。具体的可以在你远程仓库选择SSH URL的方式,举个GitHub的栗子:

克隆远程仓库到工作目录

作为一个Java developer,平时经常使用的IDE是Eclipse(用过一段时间的IntelliJ IDEA,感觉很别扭,可能是还没习惯,反正没再继续使用,也许将来会使用,谁知道呢),所以我这里将通过Eclipse来把远程仓库克隆到我本地工作目录。拷贝SSH URL(我这里使用Coding来克隆,主要是因为其在国内速度快,后面将添加GitHub作为另一个远程仓库。成功添加GitHub后便可以只从Coding拉取代码,而同时向Coding和GitHub推送代码了,这样既保证拉取时有足够快的速度又可以备份一份代码到GitHib,简直简直爽到没朋友啊。)后,粘贴到Eclipse中,使用Import Projects form Git导入项目:

粘贴后不需要进行任何设置,直接Next>进行后面的项目导入操作,这里不再赘述。

添加另一个远程仓库

由于上面我是从Coding上克隆仓库到工作目录的,所以这里我将演示如何再添加GitHub作为另一个远程仓库。如果已经配置好了SSH验证方式,并在GitHub添加了你SSH Key,在终端(Windows下你可能使用的是GitBash)进入你当前项目工作目录下的.git目录并查看:

1
2
3
4
5
6
7
8
9
10
11
~/your_working_dir/.git on git:master o
$ ll
-rw-r--r-- 1 asan staff 119 5 14 15:22 FETCH_HEAD
-rw-r--r-- 1 asan staff 23 5 14 15:22 HEAD
drwxr-xr-x 2 asan staff 68 5 14 15:22 branches
-rw-r--r-- 1 asan staff 281 5 14 15:22 config
drwxr-xr-x 2 asan staff 68 5 14 15:22 hooks
-rw-r--r-- 1 asan staff 4064 5 14 15:23 index
drwxr-xr-x 4 asan staff 136 5 14 15:22 logs
drwxr-xr-x 4 asan staff 136 5 14 15:22 objects
drwxr-xr-x 5 asan staff 170 5 14 15:22 refs

用vim打开文件config,可以看到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ vi config
[core]
repositoryformatversion = 0
filemode = true
logallrefupdates = true
precomposeunicode = true
[remote "origin"]
url = git@git.coding.net:username/your_project.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
~
~
~
"config" 11L, 281C

这时我们在[remote "origin"]节点下添加GitHub的克隆SSH URL,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ vi config
[core]
repositoryformatversion = 0
filemode = true
logallrefupdates = true
precomposeunicode = true
[remote "origin"]
url = git@git.coding.net:username/your_project.git
url = git@github.com:username/your_project.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
~
~
~
"config" 11L, 281C

保存并退出vim,当然,使用命令行也可以直接添加,命令格式如下:

1
git remote set-url --add origin git@github.com:username/your_project.git

此时我们执行命令git remote show origin会发现,后来添加的远程仓库已经是另外一个Push URL了:

1
2
3
4
5
6
7
8
9
10
11
12
$ git remote show origin
* remote origin
Fetch URL: git@git.coding.net:username/your_project.git
Push URL: git@git.coding.net:username/your_project.git
Push URL: git@github.com:username/your_project.git
HEAD branch: master
Remote branch:
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)

至此,我们就实现了推送Git项目到多个远程仓库,只从Coding拉取代码,而同时向Coding和GitHub推送代码。

附赠

在Eclipse中commit代码时,如果打开的是一个Staging View而不是一个对话框,则可以按附图中的方法进行设置:把设置项Useing Staging View to commit instead of Commit Dialog前的对勾去掉。但这个设置可能仅对Mac OSX下的Eclipse有用,因为我在Windows版本的Eclipse中并没有找到对应的设置,当然两个平台都是最新版本的Eclipse Mars,希望对碰到类似问题的童鞋有所帮助。