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

yas*_*ith 429 git github

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

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

git push -u origin devel
git push -u github devel
Run Code Online (Sandbox Code Playgroud)

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

无论如何我可以设置我的两个遥控器,以便我可以用一个命令将更改推送到两个存储库?

jwe*_*ich 679

在最新版本的Git中,您可以pushurl为给定的遥控器添加多个s.使用以下内容将2添加pushurl到您的origin:

git remote set-url --add --push origin git://original/repo.git
git remote set-url --add --push origin git://another/repo.git
Run Code Online (Sandbox Code Playgroud)

因此,当您推送时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>添加a pushurl,它会覆盖推送的默认URL.但是,您可以pushurl为给定的遥控器添加多个s,然后允许您使用单个遥控器推送到多个遥控器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/*
Run Code Online (Sandbox Code Playgroud)

现在,如果您想使用单个命令推送到两个或更多存储库,您可以创建一个名为的新远程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
Run Code Online (Sandbox Code Playgroud)

然后让我们添加一个指向另一个存储库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
Run Code Online (Sandbox Code Playgroud)

这里git remote -v显示了pushurlpush 的新内容,所以如果你这样做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
Run Code Online (Sandbox Code Playgroud)

你看到pushurl我们添加的两个都被保留了.现在一个人git push all master将把master分支推到两个git://another/repo.gitgit://original/repo.git.

  • 好像`git remote set-url --add --push all git:// another/repo.git`可能更健全.这样你仍然可以推进上游和原点,但'all'是一个特殊的遥控器用于两个遥控器. (7认同)
  • 看起来这是一个错误.Git替换了原始URL,但是使用相同的命令重新添加原始URL应该可以使它工作.`git remote -v`应该显示所有遥控器的实际URL.如果有效,请告诉我,以便我可以相应地更新我的答案. (5认同)
  • @AJB:事实上它正在增加一个新的推动力.困扰我们的是,通过推送,默认URL不再用于推送 - 我真诚地不同意. (4认同)
  • 当我执行git push origin时,它现在只推送到git://another/repo.git。现在不推向原始起点。 (2认同)
  • 疯了吧.为什么有人会想要这样的功能?首先添加Master,然后使用Backup覆盖Master,然后再次添加Master?疯狂的裤子.不重写动词的教训.`--add`表示ADD,而不是REPLACE. (2认同)
  • 我当前正在运行 git 版本 2.15.1,这对我不起作用,直到我省略了 `--add` 标志。然后似乎就克服了任何错误,一旦推送网址出现在我的配置中,我就可以使用上面的命令来满足我的需求(使用“--add”和“--push”) (2认同)

Wil*_*uta 86

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

git config alias.pushall '!git push origin devel && git push github devel'
Run Code Online (Sandbox Code Playgroud)

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

  • 你可以使用bash函数传递:`git config alias.pushall'!f(){git push origin $ 1 && git push github $ 1; }; f'` (9认同)
  • 即使这样有效,但感觉有点黑客.[这](http://stackoverflow.com/questions/14290113/git-pushing-code-to-two-remotes#answer-14290145)似乎是更好的解决方案. (7认同)
  • 反正有没有让分支成为该命令的参数? (3认同)