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

时间:2009-04-28 09:26:22

标签: svn git github

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

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

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

7 个答案:

答案 0 :(得分:178)

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会将这些提交推送到GitHub, [remotes / origin / master] 分支。你将回到第一个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。为了节省空间,我已经离开了遥控器,它们与 [master] 处于同一点。

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。保持他们的本地化,并尝试让他们接受上游接受。

答案 1 :(得分:15)

svn2github service

网站http://svn2github.com/提供服务,将任何可公开访问的SVN存储库分配到Github(https://github.com/svn2github/projectname)。我尝试过这个;在按下“制作镜子”时,它显然几秒钟内没有做任何事情并显示消息“错误”,但它实际上有效。实际上创建了新的存储库,其中包含来自SVN存储库的代码。

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

查看服务的Github用户下的现有存储库(例如“svn2github在svn2github / haxe 5小时前推送到主服务器”),它似乎经常从SVN存储库中获取更改。没有关于谁在网站上运行服务的信息,所以我不打赌它会继续无限期地运行,但它现在可以工作(如果它一直停机,你仍然可以手动更新你的分支)。

启动板

如果您没有开始使用Git和Github,另一种方法是使用Launchpad.net。 Launchpad可以自动将SVN(也是CVS)存储库导入个人bzr分支。为此,请创建一个Launchpad项目,然后转到the new import page,选择Subversion并输入URL(例如http://projectname.googlecode.com/svn/trunk/)。根据项目大小,初始导入可能需要几个小时。后续导入将定期运行。

有关更多文档,请参阅VCS Imports on Launchpad Help

答案 2 :(得分:10)

fnokd.com提供了从Google代码同步到GitHub的演练。作者使用永远在线的远程服务器和cron作业来自动执行同步,并将SVN中继保存在名为“vendor”的GitHub分支中。

答案 3 :(得分:2)

GitHub现在支持直接导入subversion项目(参见http://help.github.com/import-from-subversion/)。只需创建一个新的仓库,然后在“后续步骤”屏幕上单击“从Subversion导入”。但它不支持进一步同步:/。

答案 4 :(得分:1)

嗯..在我的公司里,我做的几乎一样。只需在同一目录中同时拥有.svn和.git repo(您可以在此工作副本中签出svn repo并创建git repo)。

然后使用svn up和git push做了这件事。当然,如果你分歧很多,你就必须手工合并。

答案 5 :(得分:0)

我不太确定你想要的是什么,当然,你可以从一个subversion存储库中提取并从同一个工作副本推送到Git存储库。您还可以git svn dcommit回到subversion存储库。但是,您无法使GitHub存储库与Subversion存储库同步。此外,当您在工作副本中提交尚未在subversion存储库中的提交时,如果更新了subversion存储库,则需要对它们进行重新绑定,从而强制您向GitHub git push --force提交“新”提交。

答案 6 :(得分:0)

我在Yu-Jie Lin的博客上找到了这些说明:

首先克隆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