Git -将代码推送到两个远程仓库

我有两个远程git 代码仓库。origingithub

我将分支devel推入两个代码仓库。

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

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

我是否可以设置两个远程代码仓库,以便用一个命令将更改推送到两个存储库?

197273 次浏览

在Git的最新版本中,你可以为一个给定的远程添加多个__abc。使用下面的语句将两个__abc0添加到你的origin中:

git remote set-url --add --push origin git://original/repo.git
git remote set-url --add --push origin git://another/repo.git

所以当你推送到origin时,它会推送到两个存储库。

Git 1.8.0.1和1.8.1(可能还有其他版本)似乎有一个错误,导致--add在你第一次使用它时替换原来的URL,所以你需要使用相同的命令重新添加原来的URL。执行git remote -v应该会显示每个远程的当前url。

Git维护者Junio C. Hamano解释了它是如何设计的。执行git remote set-url --add --push <remote_name> <url>将为给定的远程添加pushurl,其中覆盖为推送的默认URL。然而,你可以为一个给定的遥控器添加多个__abc1,然后允许你使用一个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的新远程对象,我们将在稍后推送到多个存储库时引用它:

$ 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

你可以看到,我们添加的两个__abc都被保留了。现在,单个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命令时,它将更新两个存储库。