分叉并将Google Code Subversion存储库同步到GitHub


131

如何将我没有写权限的Google Code Subversion存储库派生到GitHub存储库中并与之保持同步?

我希望能够在自己的Git存储库中开发自己的功能,但是我也想与Google Code Subversion存储库进行同步。从Google Code项目侧获取修复程序。

我了解git-svn,并在上级和下级到我完全控制的Subversion存储库之前使用过它。但是我不知道如何与Google Code Subversion存储库保持同步。

Answers:


178

git-svn的远程分支与常规Git远程几乎相同。因此,在本地存储库中,您可以拥有git-svn克隆并将更改推送到GitHub。Git不在乎。如果您创建git-svn克隆并将完全相同的更改推送到GitHub,则您将拥有Google Code存储库的非官方镜像。其余的是香草吉特。

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存储库的任何人感到不安。跟着我?确定,因此您创建了一个分支,我们称其为“功能”。然后提交并推送到GitHub到features分支。您的gitk看起来像这样:

o [features][remotes/origin/features]
|
o
|
o [master][remotes/trunk][remotes/origin/master]
|
o

在这里,您的功能分支比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掌握了,可以想象[remotes / origin / master]与master在同一点。但是您的功能分支没有更改。现在,您的选择是将母版合并到要素中,或对要素重新设定基础。合并看起来像这样

git checkout features
git merge master 

            o [features]
           /|
          / o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

然后将功能推送到GitHub。我将遥控器留给master来节省空间,它们与[master]处于同一位置。

rebase方法稍微有些邪恶-您必须使用--force进行推送,因为您的推送不会是快速合并(您可以从克隆了它的人员的下面拉出features分支)。这样做并不是真的可以,但是如果您下定决心,没有人可以阻止您。它的确使某些事情变得容易,例如当补丁以稍作修改的形式被上游接受时。不必为冲突而烦恼,您只需重新设置基础-跳过上游补丁。无论如何,rebase将是这样的:

git rebase master features

         o [features]
         |
         o
         |  o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

然后,您将不得不git push --force这样做。您可以看到为什么需要强制使用,从[remotes / origin / features]到新的当前re-rebase [features],历史都有很大的旧裂痕。

所有这些都可以,但是需要很多努力。如果您将成为常规贡献者,那么最好的办法是像这样一段时间工作,向上游发送一些补丁,看看您是否可以获得对Subversion的提交访问权限。失败的话,也许不要将您的更改发布到GitHub。将它们保留在本地,并尝试使它们无论如何都被上游接受。


感谢您的出色指示。(git这里是菜鸟。)快速提问。我是针对一个大型SVN存储库执行此操作的,结果达到了141 MB。我将其推送到github,然后将其克隆下来,结果达到130兆字节。我都跑git gc了。造成差异的原因是什么?
mpontillo 2011年

... 弄清楚了。我需要git push origin --mirror
mpontillo 2011年

像魅力一样工作,现在我只需要告诉原始的googlecode开发人员和我一起使用github:D
–lectlelake

使用的-s选项对我来说不起作用git svn clone,但是没有它,其余的就很好了。
user1027169

15

svn2github服务

网站http://svn2github.com/提供了将任何可公开访问的SVN存储库派生到Github的服务(位于https://github.com/svn2github/projectname)。我尝试过这个; 按下“制作镜子”后,它显然几秒钟没有执行任何操作,并显示了“错误”消息,但实际上确实有效。实际上,已经创建了新的存储库,其中包含SVN存储库中的代码。

然后,您将分叉它创建的存储库,并以自己的方式工作。然后,您将使用他们的bugtracker将更改提交到上游项目。

查看服务的Github用户下的现有存储库(例如“ 5个小时前将svn2github推入svn2github / haxe掌握”),它似乎确实有规律地从SVN存储库中提取更改。没有关于谁在网站上运行该服务的信息,因此我不敢打赌它可以无限期地继续运行,但是它现在可以正常工作(如果出现故障,您仍然可以手动更新您的fork)。

发射台

如果您不打算使用Git和Github,则另一种选择是使用Launchpad.net。Launchpad可以自动将SVN(也包括CVS)存储库导入到个人bzr分支中。为此,创建一个Launchpad项目,然后转到新的导入页面,选择Subversion并输入URL(例如http://projectname.googlecode.com/svn/trunk/)。根据项目规模,初始导入可能需要花费几个小时。随后的导入将定期运行。

有关更多文档,请参阅“ Launchpad帮助”上的“ VCS导入”


10

fnokd.com上提供了从Google Code同步到GitHub的演练。作者使用始终在线的远程服务器和cron作业来自动化同步,并将SVN中继保留在名为“ vendor”的GitHub分支中。



1

嗯..在我公司里,我做的差不多。只需在同一目录中同时包含.svn和.git仓库(您签出svn仓库并在此工作副本中创建git仓库)。

然后使用svn up和git push完成了任务。当然,如果您分歧很大,则必须手工合并。


Ja是,但是我想避免拥有.svn元数据,并希望git能够将svn
仓库

那么使用git-svn签出repo和git push到github是不可能的吗?
Marcin Gil

0

我不太确定您想要什么,但是您当然可以从一个Subversion存储库中提取并从同一工作副本推送到Git存储库。您还可以git svn dcommit返回到Subversion存储库。但是,您不能使GitHub存储库与Subversion存储库同步。同样,当您的工作副本中的提交尚未在Subversion存储库中提交时,如果Subversion存储库已更新,您将需要重新设置它们的基础,从而迫使您git push --force对GitHub进行“新”提交。


0

我在林玉洁的博客上找到了这些说明:

首先克隆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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.