Hak*_*ton 3 svn git version-control git-svn
我有一个现有的git存储库,我一直在努力.但是最近,我需要将提交推送到svn(不需要包含所有合并,但至少有一个线性主分支可以)
我不是很擅长git/svn,我只是一个普通的用户,使用SourceTree和CornerStone或者Tortoise,有很好的用户界面来做我的提交,分支和标记.我之前使用git-svn将svn repo迁移到git中,但从来没有反之亦然.
可能吗?我已经通过几个教程搜索,但没有一个工作.我也没有很好的与喜欢那些术语rebase
,reflog
等会很感激,如果有一些很好的指导来完成简单的事情,而不需要通过GIT中/ SVN的更复杂的部分学习.(简单,因为我猜必须有人面对同样的问题并且之前做过)
提前致谢!
好吧,它实际上很简单..首先你需要通过git克隆你的svn,然后将git repo添加为另一个遥控器.这将给你两个独立的HEAD
,这就是为什么你需要git-rebase
你的git提交到git-svn头.可能存在冲突,因为svn只有线性提交.这就是为什么在最终git svn dcommit
将所有内容都推送到svn 之前需要各种git命令来修复所有这些命令.
以下是摘要:
1.创建一个git svn clone tracking svn
git svn clone svn://DEST/repo/projectname/trunk dest
Run Code Online (Sandbox Code Playgroud)
现在我们有一个git repo跟踪导入操作的目标svn登陆点.
2:跟踪我们要导入的git仓库
cd dest
git remote add -f source /path/to/git/source/repo
Run Code Online (Sandbox Code Playgroud)
现在,如果您检查git历史记录,您将看到来自原始git repo的一系列提交,并且与此断开连接,主HEAD加上指向我们克隆的原始(单个)svn提交的git-svn HEAD.
3:将原始git repo重新基于git-svn
这就是秘密魔法的所在.我似乎有很多方法可以从这里开始.这是我发现的唯一一个工作.当然,我尝试了许多失败的方法.一旦我找到一个有效的,我就停止了尝试.所以如果有更好的方式我会喜欢听到它,但这似乎运作良好.
git rebase --onto remotes/git-svn --root source/master
Run Code Online (Sandbox Code Playgroud)
在这一点上,我意识到我的git历史不是严格线性的; 我曾经在几台机器上工作过,所以后备箱的历史有点像.
这意味着我所期望的是一个简单的操作(这是你对SVN帽子所期望的),需要一些修改:
(
gvim foo # fix merge conflict
git add foo
git rebase --continue
)
# ... rinse and repeat
Run Code Online (Sandbox Code Playgroud)
这些都是必需的,因为在不同机器上工作的源代码中的分支被合并在一起形成"源"主干开发线,并没有在没有一些调整的情况下变成一个rebase.
总的来说,冲突很小,并不难解决.
4:向上推到svn
现在我们已经安排了git-svn以上的所有内容,这是一个简单的例子:
git svn dcommit
将更改推送到svn.
资料来源:http://goodliffe.blogspot.sg/2011/08/pushing-git-repository-into-existing.html