关于GitHub:Git-将代码推送到两个远程

Git - Pushing code to two remotes

本问题已经有最佳答案,请猛点这里访问。

我有两个远程Git存储库。origingithub

我把我的分支devel推到两个存储库。

1
2
git push -u origin devel
git push -u github devel

但当我这样做的时候。git push只能推到github上。

我是否可以设置我的两个远程设备,以便用一个命令将更改推送到两个存储库?


在Git的最新版本中,可以为给定的远程设备添加多个pushurl。使用以下命令将两个pushurl添加到您的origin中:

1
2
git remote set-url --add --push origin git://original/repo.git
git remote set-url --add --push origin git://another/repo.git

因此,当您推到origin时,它将推送到两个存储库。

update 1:git 1.8.0.1 and 1.8.1(以及可能的其他版本)似乎有一个bug,导致--add在第一次使用时替换原始URL,因此需要使用相同的命令重新添加原始URL。执行git remote -v应该显示每个远程的当前URL。

更新2:Git维护人员JunioC.Hamano解释了它是如何设计的。执行git remote set-url --add --push 会为给定的远程添加一个pushurl,它会覆盖推送的默认URL。但是,您可以为一个给定的远程添加多个pushurl,然后允许您使用一个git push推送到多个远程。您可以在下面验证此行为:

1
2
3
4
5
6
7
$ git clone git://original/repo.git
$ git remote -v
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.'
remote.origin.url=git://original/repo.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

现在,如果您想使用一个命令推送到两个或多个存储库,您可以创建一个新的名为all(正如@adam nelson在comments中所建议的那样),或者继续使用origin,尽管后者的名称对此目的的描述较少。如果您仍想使用origin,请跳过以下步骤,在所有其他步骤中使用origin而不是all

因此,让我们添加一个新的名为all的远程程序,稍后我们将在推送到多个存储库时参考它:

1
2
3
4
5
6
7
8
9
$ git remote add all git://original/repo.git
$ git remote -v
all git://original/repo.git (fetch)               <-- ADDED
all git://original/repo.git (push)                <-- ADDED
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.all'
remote.all.url=git://original/repo.git            <-- ADDED
remote.all.fetch=+refs/heads/*:refs/remotes/all/* <-- ADDED

然后,我们将一个pushurl添加到all远程,指向另一个存储库:

1
2
3
4
5
6
7
8
9
10
$ git remote set-url --add --push all git://another/repo.git
$ git remote -v
all git://original/repo.git (fetch)
all git://another/repo.git (push)                 <-- CHANGED
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.all'
remote.all.url=git://original/repo.git
remote.all.fetch=+refs/heads/*:refs/remotes/all/*
remote.all.pushurl=git://another/repo.git         <-- ADDED

这里,git remote -v显示新的pushurl进行推送,所以如果你进行git push all master操作,它只会将master分支推到git://another/repo.git上。这显示了pushurl如何覆盖默认URL(remote.all.url)。

现在,让我们添加另一个指向原始存储库的pushurl

1
2
3
4
5
6
7
8
9
10
11
12
$ git remote set-url --add --push all git://original/repo.git
$ git remote -v
all git://original/repo.git (fetch)
all git://another/repo.git (push)
all git://original/repo.git (push)                <-- ADDED
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.all'
remote.all.url=git://original/repo.git
remote.all.fetch=+refs/heads/*:refs/remotes/all/*
remote.all.pushurl=git://another/repo.git
remote.all.pushurl=git://original/repo.git        <-- ADDED

你看,我们添加的两个pushurl都保留了。现在,一个单一的git push all master将把master分支推到git://another/repo.gitgit://original/repo.git上。


要使用一个命令同时发送到两个远程,可以为其创建别名:

1
git config alias.pushall '!git push origin devel && git push github devel'

这样,当您使用命令git pushall时,它将更新两个存储库。