在最新版本的 Git 中,您可以添加多个pushurl
s 表示给定的遥控器。使用以下命令添加两个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 and 1.8.1 (and possibly other versions) seem to have a bug that causes --add
to replace the original URL the first time you use it, so you need to re-add the original URL using the same command. Doing git remote -v
should reveal the current URLs for each remote.
更新2:Git 维护者 Junio C. Hamano 解释了它的设计方式。正在做git remote set-url --add --push <remote_name> <url>
adds a pushurl
对于给定的遥控器,覆盖推送的默认 URL。但是,您可以添加多个pushurl
s 对于给定的遥控器,然后允许您使用单个遥控器推送到多个遥控器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
(根据建议@亚当·纳尔逊 https://stackoverflow.com/users/26235/adam-nelson在评论中),或继续使用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
to the 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
Here git remote -v
显示新的pushurl
为了推动,所以如果你这样做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
你都看到了pushurl
我们添加的内容被保留。现在单身git push all master
将推动master
分支到两者git://another/repo.git
and git://original/repo.git
.
重要的提示:如果您的遥控器有不同的规则(挂钩)来接受/拒绝推送,则一个遥控器可能会接受它,而另一个则不会。因此,如果您希望它们具有完全相同的历史记录,则需要在本地修复您的提交,以使它们可以被两个遥控器接受并再次推送,否则您可能最终会遇到只能通过重写历史记录来修复它的情况(使用push -f
),这可能会给那些已经从存储库中提取了您之前的更改的人带来问题。