Git-将代码推送到两个遥控器



我有两个远程git存储库。origingithub

我将分支devel推送到两个存储库。

git push -u origin devel
git push -u github devel

但是,当我这样做的时候。git push它只会被推到github

我是否可以设置两个遥控器,这样我就可以用一个命令将更改推送到两个存储库?

在最近版本的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,因此您需要使用相同的命令重新添加原始URL。执行git remote -v应该显示每个远程的当前URL

UPDATE 2:Git维护者Junio C.Hamano解释了它是如何设计的。执行git remote set-url --add --push <remote_name> <url>会为给定的远程添加pushurl会覆盖推送的默认URL。但是,您可以为给定的远程添加多个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

然后,让我们向all远程添加一个pushurl,指向另一个存储库:

$ 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都已保留。现在,单个git push all master将把master分支推送到git://another/repo.gitgit://original/repo.git

重要提示:如果您的遥控器有不同的规则(挂钩(来接受/拒绝推送,一个遥控器可能会接受,而另一个则不会。因此,如果您希望它们具有完全相同的历史记录,则需要在本地修复您的提交,以使它们被远程和再次推送所接受,否则您可能会陷入只能通过重写历史记录(使用push -f(来修复的情况,这可能会给已经从repo中提取您以前的更改的人带来问题。

要用一个命令发送到两个远程,可以为其创建一个别名:

git config alias.pushall '!git push origin devel && git push github devel'

这样,当您使用命令git pushall时,它将更新这两个存储库。

最新更新