Answers:
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 push origin --mirror
。
-s
选项对我来说不起作用git svn clone
,但是没有它,其余的就很好了。
网站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导入”。
GitHub现在支持直接导入Subversion项目(请参阅http://help.github.com/import-from-subversion/)。只需创建一个新的仓库,然后在“下一步”屏幕上单击“从Subversion导入”。尽管:/,它不支持进一步同步。
嗯..在我公司里,我做的差不多。只需在同一目录中同时包含.svn和.git仓库(您签出svn仓库并在此工作副本中创建git仓库)。
然后使用svn up和git push完成了任务。当然,如果您分歧很大,则必须手工合并。
我在林玉洁的博客上找到了这些说明:
首先克隆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
git
这里是菜鸟。)快速提问。我是针对一个大型SVN存储库执行此操作的,结果达到了141 MB。我将其推送到github,然后将其克隆下来,结果达到130兆字节。我都跑git gc
了。造成差异的原因是什么?