我一直在用Git做我所有的工作,并将其推送到GitHub。我对软件和网站都很满意,我不希望在这一点上改变我的工作实践。
我的博士导师要求所有学生将作业保存在学校托管的SVN存储库中。我发现了大量关于将现有的SVN存储库下拉到Git中的文档和教程,但没有关于将Git存储库推到新的SVN存储库中的文档和教程。我希望通过结合Git -svn、一个新的分支和rebase以及所有这些美妙的术语来实现这一点,但我是Git新手,对其中任何一个都没有信心。
然后,当我选择时,我希望只运行几个命令将提交推到SVN存储库。我希望继续使用Git,让SVN存储库镜像Git中的内容。
我将是唯一一个致力于SVN的人,如果这有什么不同的话。
直接使用git rebase将丢失第一次提交。Git以不同的方式对待它,并且不能对它进行重基。
有一个程序可以保存完整的历史记录:http://kerneltrap.org/mailarchive/git/2008/10/26/3815034
我将在这里转录解决方案,但学分是Björn。
初始化git-svn:
git svn init -s --prefix=svn/ https://svn/svn/SANDBOX/warren/test2
前缀为您提供了像“svn/trunk”这样的远程跟踪分支,这很好,因为如果您只将本地分支称为“trunk”,则不会得到模棱两可的名称。-s是标准trunk/tags/branches布局的快捷方式。
从SVN中获取初始的东西:
git svn fetch
现在查看你的根提交的散列(应该显示一个单独的提交):
git rev-list --parents master | grep '^.\{40\}$'
然后获取空trunk的哈希值commit:
git rev-parse svn/trunk
创建嫁接:
git replace --graft <root-commit-hash> <svn-trunk-commit-hash>
现在,“gitk”应该将svn/trunk显示为主分支所基于的第一个提交。
使移植物永久化:
git filter-branch -- ^svn/trunk --all
掉落移植物:
git replace -d <root-commit-hash>
Gitk应该仍然在master的祖先中显示svn/trunk。
在树干顶部线性化你的历史:
git svn rebase
现在"git svn dcommit -n"应该告诉你它将提交到trunk。
git svn dcommit