131

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

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

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

4

7 回答 7

178

来自 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

在这里,您的 features 分支在 Google Code 分支之前有几个提交,对吧?那么,当您想从 Google 代码中整合新内容时会发生什么?你会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 处于同一位置。但是您的功能分支没有更改。您现在的选择是将 master 合并到 features 中,或者 rebase features。合并看起来像这样

git checkout features
git merge master 

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

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

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

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。将它们保留在本地并尝试让它们在上游被接受。

于 2009-04-28T12:01:56.377 回答
15

svn2github 服务

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

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

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

发射台

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

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

于 2012-07-23T01:39:46.420 回答
10

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

于 2009-12-10T08:05:35.787 回答
2

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

于 2011-12-14T08:50:57.753 回答
1

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

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

于 2009-04-28T09:43:12.343 回答
0

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

于 2009-04-28T12:01:59.357 回答
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
于 2013-10-25T23:38:13.187 回答