从多个远程位置拉/推
简而言之:有没有办法让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/Master
和Codaset/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
远程程序有点繁琐,因为您必须在每台使用的机器上进行设置。
另外, bash
和git
别名都假设你将推送到所有的遥控器。 (例如:我在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