从多个远程位置拉/推

简而言之:有没有办法让git仓库从远程仓库列表(而不是单个“起源”)推入并拉出?

漫长的:当我在多台计算机上开发一个应用程序时,我经常遇到这样的情况不同的连接性 – 比如在运输途中使用笔记本电脑,在某个位置使用计算机“A”,使用另一台计算机“B “而另一个。 此外,笔记本电脑可能只有“A”或“B”,有时两个连接。

我想让git总是从当前连接的所有计算机上“拉”出来,然后“推”到所有计算机上,所以从一台机器跳到另一台机器并且继续无缝工作更容易。

您可以使用git remote命令configuration多个远程存储库:

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

要从所有configuration的遥控器中获取并更新跟踪分支,但不能合并到HEAD中,请执行以下操作:

 git remote update 

如果当前没有连接到其中一个遥控器,则会花费时间或发生错误,然后继续下一个。 您必须从提取的存储库手动合并,或根据您希望组织收集更改的方式进行select。

要从alt获取主分支并将其拉入当前的头部,请执行以下操作:

 git pull alt master 

所以实际上, git pull几乎是git pull origin HEAD缩写(实际上它在configuration文件中看起来确定了这一点,但是你明白了)。

推送更新,你必须手动做到每个回购。 我认为,devise时考虑到了中央存储库的工作stream程。

做这个手动不再是必要的 ,与现代版本的git ! 见下面Malvineous的解决scheme。

转载于此:

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

原始答案:

这个东西我已经使用了一段时间没有坏的后果,并由Linus Torvalds在git邮件列表中build议 。

araqnid的解决scheme是将代码引入到你的仓库中的正确解决scheme……但是当你像我一样拥有多个同等权威的上游(我把我的一些更重要的项目克隆到私有上游,GitHub和Codaset),它可以是一个痛苦的推动每一个变化,每一天。

长话短说, git remote add所有的遥控器分别git remote add …然后git config -e并添加合并遥控器。 假设你有这个仓库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/* 

…为"Paws""Codaset"创build一个合并的远程,我可以添加以下所有的这些:

 [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(截至2012年10月)允许您从命令行执行此操作:

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

然后git push会推送到user1 @ repo1,然后推送到user2 @ repo2。 如果你也希望能够从他们那里git pull话,就不要--push了。

我将这些别名添加到我的〜/ .bashrc中:

 alias pushall='for i in `git remote`; do git push $i; done;' alias pullall='for i in `git remote`; do git pull $i; done;' 

您可以添加遥控器:

 git remote add a urla git remote add b urlb 

然后更新所有的回购做:

 git remote update 

这里是我在.gitconfig别名部分中的bash脚本示例

 [alias] pushall = "!f(){ for i in `git remote`; do git push $i; done; };f" 

你需要一个脚本来循环它们。 Git不提供“全部推送”。 理论上你可以在多个线程中进行推送,但本地方法不可用。

取更复杂,我build议线性地做。

我认为你最好的答案是有一个机器,每个人都推/拉,如果这是可能的。

我在.git congfig文件的远程“origin”中添加了两个单独的pushurl。 当我运行git push origin "branchName" ,它会遍历并推送到每个url。 不知道是否有一个更简单的方法来实现这一点,但这对我自己来说是推到Github源代码,并同时推送到My.visualStudio源代码。

 [remote "origin"] url = "Main Repo URL" fetch = +refs/heads/*:refs/remotes/origin/* pushurl = "repo1 URL" pushurl = "reop2 URl" 

我冒昧地扩大了nona-urbiz的答案 。 只需将其添加到〜/ .bashrc中:

 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 

如果你没有为git-pullall提供任何分支参数,那么从非默认遥控器拉动将失败; 保持这种行为,因为它类似于git。

为了更新遥控器(即pull ),事情变得更容易了。

莱纳斯的声明

可悲的是,甚至没有办法用git alias伪造这个。

在elliottable的答案 Git邮件列表中引用的条目不再是真实的。

git fetch在过去的某个地方学习了--all参数,可以一次性获取所有的遥控器。

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

我想在VSO / TFS中工作,然后在准备好之后公开推送到GitHub。 在私人VSO中创build初始回购。 到时候添加到GitHub我做到了:

 git remote add mygithubrepo https://github.com/jhealy/kinect2.git git push -f mygithubrepo master 

像冠军一样工作…

为了进行健全性检查,请发出“git remote -v”以列出与项目相关的存储库。

 C:\dev\kinect\vso-repo-k2work\FaceNSkinWPF>git remote -v githubrepo https://github.com/jhealy/kinect2.git (fetch) githubrepo https://github.com/jhealy/kinect2.git (push) origin https://devfish.visualstudio.com/DefaultCollection/_git/Kinect2Work (fetch) origin https://devfish.visualstudio.com/DefaultCollection/_git/Kinect2Work (push) 

辛勤的方式,为我工作…希望这可以帮助别人。

添加all远程程序有点繁琐,因为您必须在每台使用的机器上进行设置。

另外, bashgit 别名都假设你将推送到所有的遥控器。 (例如:我在github和gitlab上维护了一个sshag ,我添加了上游的远程服务器,但是我没有权限推送它。)

这里是一个git 别名 ,只推送到包含@的推送url的遥控器。

psall = "!f() { \ for R in $(git remote -v | awk '/@.*push/ { print $1 }'); do \ git push $R $1; \ done \ }; f"

添加新的远程

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

获取表单多个位置

 git fetch --all 

推送到位置

 git push -u upstream/dev