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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

如何与我无法写入访问权限的GoogleCode Subversion存储库同步到GitHub存储库中?

我希望能够在Git存储库中开发我自己的特性,但我也想与GoogleCode Subversion存储库同步。从GoogleCode项目端获取补丁。

我了解git-SVN,并在此之前使用它来向上和下游到一个我完全控制的Subversion存储库。但我不知道如何与GoogleCode Subversion存储库保持同步。

提问于
用户回答回答于

Git-SVN的远程分支与普通的Git远程分支几乎是一样的。因此,在本地存储库中,可以使用git-SVN克隆并将更改推送到GitHub。如果创建git-SVN克隆并将完全相同的更改推送到GitHub,那么将得到Google代码存储库的非官方镜像。剩下的是香草味的。

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,遥控器/起源/主人树枝在那儿。然后回到第一个ASCII艺术图中的场景。

现在的问题是,如何更改工作到混合中?这个想法是,你从来没有承诺到同一分支,你是git-SVN-重新基地-和git-推送。需要一个单独的分支来处更改。否则将最终将更改重新基于Subversion,这可能会使任何复制Git存储库的人感到不安。所以你创建一个分支,让我们称之为“特性”。然后提交并将其推到GitHub到特性分支。你的GITK看起来会是这样的:

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

在这里,在Google代码分支之前提交了几个功能分支,当你想要整合谷歌代码中的新内容时,会发生什么呢?你会跑git svn rebase先得到这个:

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

如果你git push师父,你可以想象遥控器/起源/主人与师父处于同一位置。但是功能分支没有这些更改。现在的选择是将主功能合并为功能,或者重新设置功能。合并会像这样

git checkout features
git merge master 

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

然后将功能推送给GitHub。为了节省空间,我已经把遥控器关掉了,它们会在同一点上师父.

重基方法稍微邪恶一些--你必须用力--因为你的推不是一个快速的合并(你会从克隆它的人那里提取功能分支)。这样做并不是很好,但如果你下定决心,没有人能阻止你。它也使一些事情变得更容易,例如当补丁以稍微重新加工的形式在上游被接受时。这样就省去了处理冲突的麻烦,你可以重新建立基础--跳过向上流的补丁。无论如何,重新定位应该是这样的:

git rebase master features

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

然后你就得git push --force

这一切都很有效,但这是很大的努力。如果你要成为一个经常的贡献者,最好的选择是像这样工作一段时间,向上游发送一些补丁,看看你是否可以提交对Subversion的访问。如果做不到这一点,也许不要将更改推到GitHub。

用户回答回答于

svn2gizub业务

将任何公共访问的svn存储库分送到gizub,按下“制作一面镜子”,它显然几秒钟内什么也没做,并显示了“错误”的信息,但它实际上起了作用。实际上,新的存储库是创建的,包含了SVN回购的代码。

然后,将对它创建的存储库进行分叉,并对创建的存储库进行处理。然后提交改到上游项目使用他们的错误跟踪器。

查看该服务的Gizub用户下的现有存储库(例如,“svn2gizub 5小时前推到了svn2gitub/Haxe上”),它似乎经常从SVN存储库中提取更改。没有关于谁在网站上运行该服务的信息,所以我不会押注它会无限期地运行,但它目前是有效的(如果它出现故障,仍然可以手动更新叉子)。

发射

如果不打算使用Git和Gizub,另一种选择是使用Launchpad.net。Launchpad可以自动将SVN(也是CVS)存储库导入到个人BZR分支中。为此,创建一个Launchpad项目,然后转到新的导入页面,选择Subversion并输入URL。

扫码关注云+社区