git - pull / push从多个远程位置

  显示原文与译文双语对照的内容

Short: 是否有一种方法可以让git仓库推送到远程仓库( 而不是一个单一的"原点")?

当我去看看有没有长分置情况我经常有一个应用在多台计算机中,通过对不同连接度--说一台笔记本电脑在移动中传输过程,对一个计算机"一个"当我能在一定的位置,与其它计算机"b",而在另一。 而且,笔记本电脑可能只与"一个"或者"b"连接,有时两者都有。

我想让git总是从"拉拉"和"推"到它现在可以连接的所有计算机,这样就更容易从一台机器跳转到另一个机器,并继续无缝工作。

时间:

你可以使用 git remote 命令配置多个远程仓库:


git remote add alt alt-machine:/path/to/repo

要从所有配置的远程和更新跟踪分支获取,但不合并到 HEAD,请执行以下操作:

 
git remote update

 

如果当前没有连接到一个遥控器,它将超时或者抛出一个错误,然后继续下一步。 你将不得不从获取的仓库或者cherry-pick手动合并,具体取决于你想如何组织收集更改。

要从alt中提取主分支并将它的拖入当前头部,请执行以下操作:


git pull alt master

实际上 git pull 几乎是 shorthand git pull origin HEAD ( 实际上它在配置文件中查找,但你得到了这个想法) 。

为了推动更新,你必须手工对每个仓库进行更新。 Push是,我想是用central-repository工作流设计的。

现代版本的手动这样做不再需要这里, 请参阅 Malvineous 解决方案,如下。

这里重现:


git remote set-url origin --push --add <a remote>
git remote set-url origin --push --add <another remote>


原始答案:

这是我一直在使用的,但没有坏的结果,由 李纳斯·托沃兹 在 git邮件列表列表中建议。

araqnid 解的是适当的一个用于代码带入你的存储库- - 但是,当你像我一样,有多个等价的权威 upstreams ( 我将一些更重要的项目克隆到一个私有的上游,GitHub和 Codaset ) 时,每天都会有一个痛苦的改变。

长话短说,git remote add 所有遥控器都单独使用。。 然后 git config -e 并添加一个 merged‐remote 。 假设你拥有这个仓库 config:


[remote"GitHub"]
 url = git@github.com:elliottcable/Paws.o.git
 fetch = +refs/heads/*:refs/remotes/GitHub/*
[branch"Master"]
 remote = GitHub
 merge = refs/heads/Master
[remote"Codaset"]
 url = git@codaset.com:elliottcable/paws-o.git
 fetch = +refs/heads/*:refs/remotes/Codaset/*
[remote"Paws"]
 url = git@github.com:Paws/Paws.o.git
 fetch = +refs/heads/*:refs/remotes/Paws/*

毕竟those,的- - 来创建一个用于 "Paws""Codaset" merged‐remote,我可以补充的following:


[remote"Origin"]
 url = git@github.com:Paws/Paws.o.git
 url = git@codaset.com:elliottcable/paws-o.git

一旦我做到了,当我 git push Origin Master 它将按顺序推送到 Paws/MasterCodaset/Master,使得生活更加轻松。

最新版本的git ( of 2012年10月 ) 允许你从 命令行:


git remote set-url origin --push --add user1@repo1
git remote set-url origin --push --add user2@repo2
git remote -v show

然后 git push 将推送到 user1@repo1,然后推送到 user2@repo2. 在会议上too,漏掉 --push 如果还希望能够

在 nona-urbiz ;只是把这些加到你我擅自以展开回答


git-pullall () { for RMT in $(git remote); do git pull -v $RMT $1; done; } 
alias git-pullall=git-pullall

git-pushall () { for RMT in $(git remote); do git push -v $RMT $1; done; }
alias git-pushall=git-pushall

使用方法:


git-pullall master

git-pushall master ## or
git-pushall

如果你不提供任何分支参数用于从 non-default git-pullall则拉左遥控器就会失败,但这种行为,因为它是,因为它是类似于 git 。

用于更新遥控器( 例如 。 pull 案例),事情变得更容易了。

李纳斯的语句

不幸的是,甚至没有任何方法可以用git别名来伪装这个。

在建议最新邮件列表所引用的条目中的elliottcable回答中 都不再真实。

git fetch 在过去的某个地方学习了 --all 参数,允许在一个位置获取所有的遥控器。

如果不是全部请求,可以使用 --multiple switch 来指定多个遥控器或者一个组。

正在添加新远程


git remote add upstream https://github.com/example-org/example-repo.git

git remote -vv

提取多个位置

 
git fetch --all

 

推送到位置


git push -u upstream/dev

...