叉和谷歌代码Subversion的存储库同步到GitHub
我怎样才能将一个Google代码Subversion版本库与我没有写入权限的代码库分离并保持同步,并将其保存到GitHub存储库中?
我希望能够在我的Git仓库中开发自己的function,但是我也想同步Google Code Subversion仓库。 从Google Code项目端获取修补程序。
我知道git-svn,并在之前和之后用它来完全控制一个Subversion版本库。 但是我不知道如何与Google Code Subversion版本库保持同步。
git-svn的远程分支与常规的Git远程分支几乎相同。 所以在你的本地仓库中,你可以使用你的git-svn克隆,并把更改推送给GitHub。 Git不在乎。 如果你创build了你的git-svn clone,并把完全相同的变化推送到GitHub上,你将得到一个非官方的Google代码库镜像。 其余的是香草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
会将那些提交推送到GitHub,那里是[remotes / origin / master]分支。 你会回到第一个ASCII艺术图中的场景。
现在的问题是,你如何改变你的改变? 这个想法是,你永远不会犯同样的分支,你是git-svn-rebase-ing和git-pushing。 您需要一个单独的分支来进行更改。 否则,你最终将在Subversion之上重新定义你的更改,这可能会让任何克隆你的Git仓库的人感到困扰。 跟着我? 好,那么你创build一个分支,我们称之为“function”。 你做了一个提交,并把它推到GitHub的function分支。 你的gitk看起来像这样:
o [features][remotes/origin/features] | o | o [master][remotes/trunk][remotes/origin/master] | o
在这里,你的function在Google Code分支之前分支了几个提交,对吧? 那么当你想从Google Code中整合新的东西时会发生什么呢? 你会先运行git svn rebase
然后得到这个:
o [features][remotes/origin/features] [master][remotes/trunk] o | | o o / |/ o[remotes/origin/master] | o
如果你git push
主推出来,你可以想象[遥控器/原点/主控]与主控相同。 但是你的function分支没有改变。 现在您的select是将主人合并到function或重设function。 合并将如下所示
git checkout features git merge master o [features] /| / o [remotes/origin/features] [master] o | | o o / |/ o | o
然后你将function推送到GitHub。 为了节省空间,我放弃了遥控器,他们会和[主]一样 。
rebase方法稍微恶化 – 你必须用-force来推动,因为你的推动不会是一个快速的合并(你可以从克隆它的人下拉出特性分支)。 这样做并不是真的认为可以,但是如果你有决心,没有人能阻止你。 它也可以使一些事情变得更容易,比如当补丁以稍微返工的forms被上游接受时。 它可以避免不必要的冲突,你可以重新分配 – 跳过已经存在的补丁。 无论如何,rebase会是这样的:
git rebase master features o [features] | o | o [remotes/origin/features] [master] o | | o o / |/ o | o
然后你将不得不git push --force
这一点。 你可以看到为什么你需要强制执行它,历史上有一个很大的旧分裂从[遥控/起源/特征]到新的当前后基调[特征] 。
这一切都有效,但这是一个很大的努力。 如果你打算成为一个普通的贡献者,最好的办法就是像这样工作一段时间,向上游发送一些补丁,看看你是否可以获得Subversion的提交权限。 如果不这样做,也许不要把你的改变推给GitHub。 把它们保持在本地,然后试着让它们在上游被接受。
svn2github服务
网站http://svn2github.com/提供了一个服务,将任何可公开访问的SVN仓库分发到Github上(; https://github.com/svn2github/projectname )。 我尝试过这个; 按下“制作镜子”后,显然几秒钟内没有任何操作,并显示“错误”信息,但实际上已经工作。 新的存储库实际上是创build的,包含SVN回购代码。
然后,您可以分叉它创build的存储库,并在您自己的分支上工作。 然后,您将使用他们的错误跟踪器将您的更改提交给上游项目。
查看服务的Github用户下的现有存储库(例如,“svn2github 5小时前推送给svn2github / haxe的master”),它似乎经常从SVN存储库中引入更改。 没有关于谁在网站上运行该服务的信息,所以我不打赌继续无限期地运行,但它现在工作(如果它曾经下降,你仍然可以手动更新你的叉)。
发射台
如果你没有设置使用Git和Github,另一种方法是使用Launchpad.net。 启动板可以自动导入SVN(也CVS)存储库到个人bzr分支。 为此,创build一个Launchpad项目,然后进入新的导入页面 ,selectSubversion并inputURL(例如http://projectname.googlecode.com/svn/trunk/
)。 根据项目大小,最初的导入可能需要几个小时。 后续导入将定期运行。
有关更多文档,请参阅启动板帮助上的VCS导入 。
从Google代码到GitHub的同步步骤可以在fnokd.com上find 。 作者使用一个永远在线的远程服务器和一个cron作业来实现同步自动化,并将SVN中继保留在一个名为“vendor”的GitHub分支中。
GitHub现在支持直接导入Subversion项目(参见http://help.github.com/import-from-subversion/ )。 只需创build一个新的回购,然后点击“下一步”屏幕上的“从Subversion导入”。 它不支持进一步的同步,但:/。
嗯..在我的公司,我几乎一样。 只需在同一个目录下有两个.svn和.git回购(你在这个工作副本上签出svn回购和创buildgit回购)。
然后使用svn和git push做的事情。 当然,如果你分歧很大,你将不得不手工合并。
我不太清楚你想要什么,但是,当然你可以从Subversion版本库中取出,并从相同的工作副本推送到Git仓库。 你也可以将git svn dcommit
返回到subversion版本库。 不过,您不能让GitHub存储库与Subversion存储库同步。 另外,当你在你的工作拷贝中提交了不在Subversion版本库中的提交时,如果Subversion版本库已经更新,你将需要重新绑定它们,强制你将git push --force
到“GitHub”。
我在林玉洁的博客上find了这些说明:
首先克隆Subversion版本库并推送到Git:
git svn clone https://foo.googlecode.com/svn/ git-foo cd git-foo git remote add git-foo git@github.com:username/foo.git git push git-foo master
在Subversion版本库中提交后,运行
cd /path/to/git-foo git svn fetch git svn rebase git push git-foo master