繁体   English   中英

Git - 将代码推送到两个遥控器[重复]

[英]Git - Pushing code to two remotes [duplicate]

在最新版本的 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时,它将推送到两个存储库。

更新 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>会为给定的远程添加一个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

然后让我们添加一个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都被保留了。 现在单个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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM