我有两个远程git存储库。 origin
和github
我将我的分支devel
推送到两个存储库。
git push -u origin devel
git push -u github devel
然而,当我这样做的时候。 git push
它只会被推送到github
。
无论如何我可以设置我的两个遥控器,以便我可以用一个命令将更改推送到两个存储库吗?
答案 0 :(得分:629)
在最近的Git版本中,您可以为给定的遥控器添加多个pushurl
。使用以下内容将两个pushurl
添加到origin
:
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和1.8.1(可能还有其他版本)似乎有一个错误导致 --add
第一次替换原始网址你使用它,所以你需要使用相同的命令重新添加原始URL。执行git remote -v
应显示每个远程的当前URL。
更新2: Git维护者Junio C. Hamano解释了它是如何设计的。执行git remote set-url --add --push <remote_name> <url>
会为给定的遥控器添加pushurl
,其中会覆盖推送的默认网址。但是,您可以为给定的遥控器添加多个pushurl
,然后允许您使用单个git push
推送到多个遥控器。您可以在下面验证此行为:
$ 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建议),或继续使用{ {1}},尽管后一个名称对此目的的描述较少。如果您仍想使用origin
,请跳过以下步骤,并在所有其他步骤中使用origin
代替origin
。
所以让我们添加一个名为all
的新远程,我们稍后会在推送到多个存储库时引用它:
all
然后我们将$ 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
此处$ 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
如何覆盖默认网址(remote.all.url)。
现在让我们添加指向原始存储库的另一个pushurl
:
pushurl
您会看到我们添加的$ 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.git
。
答案 1 :(得分:81)
要使用一个命令发送到两个远程,您可以为它创建别名:
git config alias.pushall '!git push origin devel && git push github devel'
这样,当您使用命令git pushall
时,它将更新两个存储库。