我使用git-svn迁移到git。我们的svn仓库仍然保持机智,我们仍然可以获得所有的“git awesomeness”。基本上在git-svn克隆之后,你再次将它作为你的'trunk'分支。每个使用git的人都会从这里分支。当你需要从svn获得更新时,你只需执行git-svn rebase,然后执行git merge --squash从svn分支到新的'trunk'。反之亦然。这将意味着您在svn回购中的历史记录与git中的内容不符。当你多做一次合并时,在某个时候你将不得不开始嫁接提交,因为历史不匹配。但是,如果你将git主干的头部移植到最后一个被压扁合并的提交id,你将会得到相同的效果。
好吧,让我把这个打破最好的我可以用一个例子。
svn的: 的svn://xyz.com/myproject
git svn clone svn://xyz.com/myproject
这应该离开你与主分支具有相同历史的svn库一个正常的git - svn的设置。
git checkout -b git_trunk
git_trunk成为git用户的“主干”。
这个分支可以像任何其他git仓库一样自由使用。
现在,你需要通过git的这两个分支合并--squash
例如同步..从主SVN分支合并到git_trunk
git checkout git_trunk
git merge --squash master
git commit -a
你会做同样的事情,以从git_trunk合并到主SVN 除非您需要执行
git svn dcommit
这将推动回SVN。
因此,这里复杂的部分是,因为我们正在使用--squash合并历史丢失,唯一共同的祖先git将知道的是分支点。这将意味着合并冲突。我解决它的方式是通过做这样的事情
从git_trunk合并到主。首先我把git_trunk上的最后一个压扁的提交ID。可以称之为ABCDEFG。然后我得到git_trunk的提交。比方说,它的HIJKLMNO
echo "HIJKLMNO ABCDEFG" > .git/info/grafts
合并,最共同的祖先是最近压扁承诺时,这会告诉饭桶。
它不完美,但它对我很好。特别是现在几乎每个人都在使用git。
你真的不应该得到这样的颠覆性问题。我们在工作中管理的Subversion版本库相当庞大(超过10,000个文件),我们从未遇到任何腐败问题。听起来更像是一个硬件问题,任何腐败都不应该发生。 – Kezzer 2009-08-21 08:02:32
我猜你的版本库不是由非程序员使用:)他们可以破坏任何东西。 – vava 2009-08-21 08:07:39
@vava:非程序员可能会打破他们的_working copy_并失去大量工作,但他们肯定不应该破坏_repository_。在那里似乎有些鱼腥味,如果我是你,我会试着在做其他事情之前弄清楚这是怎么发生的。 – sbi 2009-08-21 09:06:47