Git - 将代码推送到两个 Remote

标签 git github

<分区>

我有两个 远程git 存储库。 来源github

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

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

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

无论如何我可以设置我的两个 Remote ,这样我就可以用一个命令将更改推送到两个存储库吗?

最佳答案

在最新版本的 Git 中,您可以添加多个 pushurl s 对于给定的 Remote 。使用以下添加两个 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 时,它将推送到两个存储库。

更新 1:Git 1.8.0.1 和 1.8.1(可能还有其他版本)似乎有一个导致 --add 的错误第一次使用时要替换原来的网址,所以需要用同样的命令重新添加原来的网址。做git remote -v应该显示每个 Remote 的当前 URL。

更新 2:Git 维护者 Junio C. Hamano 解释了它的设计方式。做git remote set-url --add --push <remote_name> <url>添加 pushurl对于给定的 Remote ,它覆盖推送的默认 URL。但是,您可以添加多个 pushurl s 用于给定的 Remote ,然后允许您使用单个 git push 推送到多个 Remote .您可以在下面验证此行为:

$ 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 的新 Remote 稍后我们将在推送到多个存储库时引用:

$ 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

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

$ 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.gitgit://original/repo.git .

重要说明:如果您的 Remote 有不同的规则( Hook )来接受/拒绝推送,则一个 Remote 可能会接受它,而另一个则不会。因此,如果您希望它们具有完全相同的历史记录,则需要在本地修复您的提交以使它们被两个远程服务器接受并再次推送,否则您可能最终会遇到只能通过重写历史记录来修复它的情况(使用 push -f ),这可能会给已经从存储库中提取您之前的更改的人带来问题。

关于Git - 将代码推送到两个 Remote ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14290113/

相关文章:

windows - git 和 subversion 可以一起玩吗?

git - "branch ... not fully merged"获取后立即

github - 在github上打开时如何更改Visual Studio的版本

git:提交多个文件但添加消息

GitHub:抱歉,此差异不可用(fork 已删除)

git clone 命令不起作用?

git - 部署期间的 aws codedeploy git 修订版

windows - 如何在 Windows 上设置 git?

git - 尖括号在文档中是什么意思?

php - 很难理解 Git 和 Github 在我的网络服务器上的位置