我有一个'git-svn'工作树.我想克隆一个"纯"的git repo,然后使用git push/pull在git-svn树和git树之间移动更改,同时还使用'git svn dcommit/rebase'来移动git-svn树和基于它的SVN repo.
这似乎可以正常使用git方法在git树之间来回移动,但是当我在git-svn树中与SVN repo交互时,事情就变得很糟糕 - 要么我在推送时遇到错误,要么在git树之间拉扯,或者我在git-svn树中丢失了提交,或者其他奇怪的东西.
是否支持这种类型的SVN < - > git-svn < - > git工作流,还是应该退出这棵树?
我有一些桥接设置用于我的一些项目,但它只是从git到svn的单向(提供我们的git master分支的公共只读SVN镜像).但是,因为它可以正常工作,所以无论如何它可以帮助你或指向正确的双向方案,因为我认为它是git-> svn会产生问题,而不是svn-> git:
我的单向场景:github上的现有git存储库,需要一个git master分支的只读svn镜像
在服务器上创建并初始化目标subversion存储库:
svnadmin create svnrepo mkdir trunk svn import trunk svn://yoursvnserver/svnrepo rmdir -rf trunk
创建一个混合的Git-Svn签出并初始化subversion存储库
git svn clone svn://yoursvnserver/svnrepo/trunk cd trunk git remote add github git://github.com/yourname/repo.git git fetch github git branch tmp $(cat .git/refs/remotes/github/master) git tag -a -m "Last fetch" last tmp INIT_COMMIT=$(git log tmp --pretty=format:%H | tail -1) git checkout $INIT_COMMIT . git commit -C $INIT_COMMIT git rebase master tmp git branch -M tmp master git svn dcommit --rmdir --find-copies-harder
更新镜像
git fetch github git branch tmp $(cat .git/refs/remotes/github/master) git tag -a -m "Last fetch" newlast tmp git rebase --onto master last tmp git branch -M tmp master git svn dcommit --rmdir --find-copies-harder mv .git/refs/tags/newlast .git/refs/tags/last
来自googlecode的这两篇文章也可能有所帮助:
从Git导入
导出到Git
将Git与Google Code Hosting一起使用
使用Git开发Google代码项目
可能导致您麻烦的一件事是git svn dcommit
将重写它发送给SVN的所有提交 - 至少如果它被配置为将SVN元数据注释添加到提交消息的底部.因此,您必须采用一个流程,其中任何存储库从您的git-svn工作空间提交对其进行重新设置,丢失所有无法存储在SVN中的合并历史记录.
基于我所看到的,git-svn不支持此工作流,并且由于SVN表示合并的方式,因此不会支持此工作流.