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