如何将我没有写入权限的Google Code Subversion存储库与GitHub存储库保持同步?
我希望能够在我的Git存储库中开发自己的功能,但我也希望与Google Code Subversion存储库同步.从Google Code项目端获取修复程序.
我知道git-svn并在之前和下游使用它到我完全控制的Subversion存储库.但我不知道如何与Google Code Subversion存储库保持同步.
git-svn的远程分支与普通的Git远程分支几乎相同.因此,在您的本地存储库中,您可以使用git-svn克隆并将更改推送到GitHub.Git不关心.如果您创建了git-svn克隆并将完全相同的更改推送到GitHub,那么您将拥有Google Code存储库的非官方镜像.其余的是香草Git.
git svn clone http://example.googlecode.com/svn -s git remote add origin git@github.com:example/example.git git push origin master
既然你有这个,偶尔你必须将Subversion存储库与Git同步.它看起来像:
git svn rebase git push
在gitk或其他什么,这看起来像这样:
o [master][remotes/trunk][remotes/origin/master] | o | o
当你跑步时git svn rebase
,你会有这样的:
o [master][remotes/trunk] | o | o [remotes/origin/master] | o | o
所以现在运行git push
会将这些提交推送到那里的[remotes/origin/master]分支GitHub .你将回到第一个ASCII艺术图中的场景.
现在的问题是,你如何将你的变化融入到混合中?这个想法是,你永远不会进入同一个分支,你就是git-svn-rebase-ing和git-pushing.您需要一个单独的分支来进行更改.否则,你最终会在Subversion之上重新定义你的更改,这可能会破坏任何克隆你的Git存储库的人.跟着我?好的,所以你创建了一个分支,我们称之为"功能".然后你做了一个提交并将它推送到GitHub到功能分支.你的gitk看起来像这样:
o [features][remotes/origin/features] | o | o [master][remotes/trunk][remotes/origin/master] | o
在这里,你的功能分支在Google Code分支之前提交了一些提交,对吧?那么当您想要整合Google代码中的新内容时会发生什么?你先跑,git svn rebase
然后得到这个:
o [features][remotes/origin/features] [master][remotes/trunk] o | | o o / |/ o[remotes/origin/master] | o
如果你git push
掌握了,你可以想象[遥控器/原点/主人]与主人在同一点.但是您的功能分支没有更改.您现在的选择是将master合并到功能或rebase功能.合并看起来像这样
git checkout features git merge master o [features] /| / o [remotes/origin/features] [master] o | | o o / |/ o | o
然后你将功能推送到GitHub.我已经离开遥控器为主人节省空间,他们与[主人]在同一点.
rebase方法稍微有些恶意 - 你必须推动使用--force,因为你的推送不会是快速合并(你可以从克隆它的人手中拉出功能分支).这样做并不是真的可以,但如果你有决心,没有人可以阻止你.它确实使一些事情变得更容易,例如当补丁以略微重写的形式上游接受时.它不仅可以解决冲突问题,还可以直接修改 - 修补上流的补丁.无论如何,一个rebase将是这样的:
git rebase master features o [features] | o | o [remotes/origin/features] [master] o | | o o / |/ o | o
然后你就必须git push --force
这样做.你可以看到为什么你需要强制它,历史从[遥控器/原点/功能]到新的当前后期变换[功能]有一个很大的分裂.
这一切都有效,但需要付出很多努力.如果你要成为一个常规的贡献者,最好的办法就是这样工作一段时间,向上游发送一些补丁,看看你是否可以获得Subversion的提交权限.如果做不到这一点,也许不要将你的更改推给GitHub.保持他们的本地化,并尝试让他们接受上游.
网站http://svn2github.com/提供了一个服务,可以将任何可公开访问的SVN存储库分配到Github上(https://github.com/svn2github/projectname).我尝试过这个; 在按下"制作镜子"时,它显然没有做几秒钟并显示消息"错误",但它实际上有效.实际上创建了新的存储库,其中包含来自SVN repo的代码.
然后,您将分叉它创建的存储库,并在您自己的fork上工作.然后,您将使用其bugtracker将更改提交到上游项目.
查看服务的Github用户下的现有存储库(例如"svn2github在svn2github/haxe 5小时前推送到主服务器"),它似乎经常从SVN存储库中获取更改.没有关于谁在网站上运行该服务的信息,所以我不打赌它继续无限期运行,但它现在可以工作(如果它永远停止,你仍然可以手动更新你的分支).
发射台如果您没有开始使用Git和Github,另一种方法是使用Launchpad.net.Launchpad可以自动将SVN(也是CVS)存储库导入个人bzr分支.为此,请创建一个Launchpad项目,然后转到新的导入页面,选择Subversion并输入URL(例如http://projectname.googlecode.com/svn/trunk/
).根据项目大小,初始导入可能需要几个小时.后续导入将定期运行.
有关更多文档,请参阅Launchpad帮助中的VCS Imports.
fnokd.com提供了从Google Code同步到GitHub的演练.作者使用永远在线的远程服务器和cron作业来自动化同步,并将SVN中继保存在名为"vendor"的GitHub分支中.