我有两个远程git存储库。起源和github
我把我的分支devel推到两个存储库。
git push -u origin devel
git push -u github devel
但是,当我这样做的时候。它只会被推送到github。
我是否可以设置两个遥控器,以便用一个命令将更改推送到两个存储库?
我有两个远程git存储库。起源和github
我把我的分支devel推到两个存储库。
git push -u origin devel
git push -u github devel
但是,当我这样做的时候。它只会被推送到github。
我是否可以设置两个遥控器,以便用一个命令将更改推送到两个存储库?
在Git的最新版本中,您可以为给定的远程添加多个推送。使用以下命令在原点上添加两个推送:
git remote set-url --add --push origin git://original/repo.git
git remote set-url --add --push origin git://another/repo.git
当你推送到原点时,它会推送到两个存储库。
更新1:Git 1.8.0.1和1.8.1(可能还有其他版本)似乎有一个bug,它会在您第一次使用它时替换原来的URL,因此您需要使用相同的命令重新添加原来的URL。执行git remote -v将显示每个远程的当前url。
更新2:Git维护者Junio C. Hamano解释了它是如何设计的。执行git remote set-url——add——push <remote_name> <url>为给定的远程添加一个推送,它会覆盖推送的默认url。但是,您可以为给定的远程添加多个推送,然后允许您使用单个git推送推送到多个远程。你可以在下面验证这个行为:
$ 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在评论中所建议的那样),或者继续使用原始存储库,尽管后一个名称对于这个目的来说描述性较差。如果您仍然想使用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
然后让我们添加一个push到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显示了新的push分支,所以如果你使用git push all master,它会将master分支推到git://another/repo。git。这显示了pushurl如何覆盖默认url (remote.all.url)。
现在让我们添加另一个指向原始存储库的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
你可以看到我们添加的两个推送都被保留了。现在一个git push all master将把master分支推到两个git://another/repo。Git和Git://original/repo.git。
重要提示:如果你的遥控器有不同的规则(挂钩)来接受/拒绝推送,一个遥控器可能会接受它,而另一个则不会。因此,如果您希望它们具有完全相同的历史记录,您将需要在本地修复您的提交,以使它们能够被远程和push再次接受,或者您可能会陷入只能通过重写历史(使用push -f)来修复它的情况,这可能会给已经从repo中取出您之前更改的人带来问题。
要用一个命令发送到两个远程,你可以为它创建一个别名:
git config alias.pushall '!git push origin devel && git push github devel'
这样,当您使用git pushall命令时,它将更新两个存储库。