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

Posted

技术标签:

【中文标题】Fork 并将 Google Code Subversion 存储库同步到 GitHub【英文标题】:Fork and synchronize Google Code Subversion repository into GitHub 【发布时间】:2010-10-22 06:31:02 【问题描述】:

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

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

我知道 git-svn 并且之前使用它来向上和向下传输到我可以完全控制的 Subversion 存储库。但我不知道如何与 Google Code Subversion 存储库保持同步。

【问题讨论】:

【参考方案1】:

来自 git-svn 的远程分支与普通的 Git 远程分支几乎相同。因此,在您的本地存储库中,您可以克隆 git-svn 并将更改推送到 GitHub。吉特不在乎。如果您创建 git-svn 克隆并将完全相同的更改推送到 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 存储库的任何人感到不安。跟着我?好的,所以你创建了一个分支,我们称之为“功能”。然后你做出一个提交并将其推送到 GitHub 的功能分支。你的 gitk 看起来像这样:

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

在这里,您的功能分支在 Google 代码分支之前有几个提交,对吧?那么,当您想从 Google 代码中整合新内容时会发生什么?你会先运行git svn rebase 并得到这个:

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

如果你git push master out,你可以想象 [remotes/origin/master] 与 master 在同一点。但是您的功能分支没有更改。您现在的选择是将 master 合并到 features 中,或者 rebase features。合并看起来像这样

git checkout features
git merge master 

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

然后您将功能推送到 GitHub。为了节省空间,我已经把遥控器留给主人了,它们会和 [master] 处于同一位置。

rebase 方法稍微有点邪恶——你必须用 --force 推动,因为你的推动不会是快进合并(你会从克隆它的人那里拉出特性分支)。这样做并不被认为是可以的,但如果你下定决心,没有人可以阻止你。它确实也让一些事情变得更容易,例如当补丁以略微修改的形式被上游接受时。它可以省去处理冲突的麻烦,你可以 rebase --skip 上游补丁。无论如何,rebase 应该是这样的:

git rebase master features

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

然后你必须git push --force 那。你可以看到为什么你需要强制它,历史从 [remotes/origin/features] 到新的当前 post-rebase [features] 之间存在很大的分歧.

这一切都有效,但需要付出很多努力。如果你打算成为一名普通的贡献者,最好的办法是像这样工作一段时间,向上游发送一些补丁,看看你是否可以获得对 Subversion 的提交访问权限。如果做不到这一点,也许不要将您的更改推送到 GitHub。将它们保留在本地并尝试让它们在上游被接受。

【讨论】:

感谢您的出色指导。 (git noob 在这里。)快速提问。我针对一个大型 SVN 存储库执行此操作,结果约为 141 兆字节。我将它推送到 github,然后将其克隆回来,结果达到 130 兆字节。我在两者上都运行了git gc。造成这种差异的原因是什么? ...想通了。我需要git push origin --mirror 工作就像一个魅力,现在我只需要告诉原来的 googlecode 开发人员和我一起使用 github :D 这对我来说不适用于 -s 选项 git svn clone,但没有它,其余的工作都很好。【参考方案2】:

svn2github 服务

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

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

查看服务的 Github 用户下的现有存储库(例如“5 小时前在 svn2github/haxe 上推送到 master”),它似乎确实定期从 SVN 存储库中提取更改。没有关于谁在网站上运行该服务的信息,所以我不会打赌它会无限期地继续运行,但它现在可以工作(如果它出现故障,你仍然可以手动更新你的 fork)。

启动板

如果您不打算使用 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。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

这个方法已经不存在了 现在改用import.github.com/new。见help.github.com/articles/importing-from-subversion。【参考方案5】:

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

然后使用 svn up 和 git push 来做这件事。当然,如果分歧很大,则必须手动合并。

【讨论】:

没错,但我想避免拥有 .svn 元数据,并希望 git 能够使用 svn 存储库作为下游主控 那么是不是可以使用 git-svn 来 checkout repo 和 git push 到 github 呢?【参考方案6】:

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

【讨论】:

【参考方案7】:

我在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

【讨论】:

以上是关于Fork 并将 Google Code Subversion 存储库同步到 GitHub的主要内容,如果未能解决你的问题,请参考以下文章

找不到 chromedriver 可执行文件

Teaching Your Computer To Play Super Mario Bros. – A Fork of the Google DeepMind Atari Machine Learn

fork/joinjava并发编程-fork/join示例

fork 和 signal:如何将信号从父进程发送到特定的子进程

使用 rtmplite 在 Google App Engine 中录制音频?

c中的fork()和管道()