(17个答案)八年前就关门了。我有两个远程git仓库。origin和github我将分支devel推送到这两个存储库。
origin
github
devel
git push -u origin devel git push -u github devel
但是,当我这样做的时候,它只会被推到github。有没有什么方法可以设置我的两个远程,这样我就可以用一个命令将更改推送到两个存储库?
oewdyzsn1#
在Git的最新版本中,你可以为一个给定的遥控器添加多个pushurl。使用下面的命令来为你的origin添加两个pushurl:
pushurl
git remote set-url --add --push origin git://original/repo.git git remote set-url --add --push origin git://another/repo.git
因此,当您推送到origin时,它将同时推送到两个存储库。
更新1:Git1.8.0.1和1.8.1(也可能是其他版本)似乎有一个bug,导致--add在你第一次使用它的时候替换原始的URL,所以你需要使用相同的命令重新添加原始的URL,执行git remote -v应该会显示每个远程控制器的当前URL。**更新2:Junio C. Hamano,Git维护者,解释了它的设计。执行git remote set-url --add --push <remote_name> <url>会为给定的远程添加一个pushurl,这会覆盖推送的默认URL。但是,您可以为给定的远程添加多个pushurl,这样您就可以使用一个git push推送到多个远程。您可以在下面验证此行为:
--add
git remote -v
git remote set-url --add --push <remote_name> <url>
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纳尔逊在评论中建议的那样),或者继续使用origin,尽管后一个名称对此用途的描述性较小,如果你仍然想使用origin,跳过下面的步骤,并在所有其他步骤中使用origin代替all。因此,让我们添加一个名为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用于push,所以如果你执行git push all master,它将只把master分支push到git://another/repo.git,这显示了pushurl如何覆盖默认的url(remote.all.url)。现在让我们添加另一个指向原始仓库的pushurl:
git push all master
master
git://another/repo.git
$ 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和git://original/repo.git。
git://original/repo.git
重要说明:如果您的遥控器有不同的规则(钩子)来接受/拒绝一个推送,一个远程节点可以接受它,而另一个不接受。因此,如果你想让它们拥有完全相同的历史,你需要在本地修改你的提交,使它们可以被两个远程节点接受,然后再次推送,否则你可能会陷入只能通过重写历史来修改的境地。(使用push -f),这可能会给已经从repo中拉出您以前的更改的人带来问题。
push -f
pod7payv2#
要使用一个命令同时发送到两个远程设备,您可以为其创建别名:
git config alias.pushall '!git push origin devel && git push github devel'
这样,当您使用命令git pushall时,它将更新两个存储库。
git pushall
2条答案
按热度按时间oewdyzsn1#
在Git的最新版本中,你可以为一个给定的遥控器添加多个
pushurl
。使用下面的命令来为你的origin
添加两个pushurl
:因此,当您推送到
origin
时,它将同时推送到两个存储库。更新1:Git1.8.0.1和1.8.1(也可能是其他版本)似乎有一个bug,导致
--add
在你第一次使用它的时候替换原始的URL,所以你需要使用相同的命令重新添加原始的URL,执行git remote -v
应该会显示每个远程控制器的当前URL。**更新2:Junio C. Hamano,Git维护者,解释了它的设计。执行
git remote set-url --add --push <remote_name> <url>
会为给定的远程添加一个pushurl
,这会覆盖推送的默认URL。但是,您可以为给定的远程添加多个pushurl
,这样您就可以使用一个git push
推送到多个远程。您可以在下面验证此行为:现在,如果要使用单个命令推送到两个或多个存储库,可以创建一个名为
all
的新远程数据库(正如@Adam纳尔逊在评论中建议的那样),或者继续使用origin
,尽管后一个名称对此用途的描述性较小,如果你仍然想使用origin
,跳过下面的步骤,并在所有其他步骤中使用origin
代替all
。因此,让我们添加一个名为
all
的新远程数据库,稍后我们将在推送到多个仓库时引用它:然后,让我们将
pushurl
添加到all
遥控器,指向另一个存储库:这里
git remote -v
显示了新的pushurl
用于push,所以如果你执行git push all master
,它将只把master
分支push到git://another/repo.git
,这显示了pushurl
如何覆盖默认的url(remote.all.url)。现在让我们添加另一个指向原始仓库的
pushurl
:您可以看到我们添加的两个
pushurl
都被保留了,现在一个git push all master
会将master
分支推送到git://another/repo.git
和git://original/repo.git
。重要说明:如果您的遥控器有不同的规则(钩子)来接受/拒绝一个推送,一个远程节点可以接受它,而另一个不接受。因此,如果你想让它们拥有完全相同的历史,你需要在本地修改你的提交,使它们可以被两个远程节点接受,然后再次推送,否则你可能会陷入只能通过重写历史来修改的境地。(使用
push -f
),这可能会给已经从repo中拉出您以前的更改的人带来问题。pod7payv2#
要使用一个命令同时发送到两个远程设备,您可以为其创建别名:
这样,当您使用命令
git pushall
时,它将更新两个存储库。