我厌倦了颠覆,它不断破坏自己的存储库。因为我很长一段时间都是古怪的并且总是想尝试一下,所以我决定试一试并使用git-svn。但阅读文档我意识到你不能使用它的git awesomeness。你不能使用git-pull,不建议创建本地分支,并且有很多限制。看起来它比直接使用subversion好多了。或者是吗? git-svn对普通svn有什么利弊?
PS 即可。对不起,我不是在问你如何修复我的subversion存储库,我不在乎。一夜之间删除同一目录中的所有.svn和checkout工作正常。我只是想知道git-svn带来什么好处。
答案 0 :(得分:4)
优点:
git svn dcommit
将所有更改推送到SVN以进行良好的干净提交:)
缺点:
答案 1 :(得分:3)
这些是使用git-svn的特定pro和con。所以这并不是关于git本身的。
<强>临强>:
人们使用svn的倾向是一次性进行大的更改,因为你需要通过线路提交。这种方法可能很糟糕,因为有时这些变化可能彼此无关。例如:您可以对一个变更集上提交的新功能的错误修正和更改进行更改。使用git,我可以经常提交到我的本地git存储库(特别是当我没有连接到网络时)并且变更集尽可能小。然后,当整个重大更改准备就绪时,我提交svn(使用'git svn dcommit')。
<强> N 强>:
将svn作为远程存储库进行合并,尤其是在存在冲突时。有时可能会很痛苦。我使用IntelliJ作为我的IDE并解决冲突,我必须去命令行来修复它。知道我经常遇到这个问题,I have documented it现在它对我来说不再是一个大问题了。
答案 2 :(得分:3)
我使用git-svn迁移到git。我们的svn存储库仍然很机智,我们仍然得到所有的“git awesomeness”。基本上在git-svn克隆之后你再次将它作为你的“主干”分支。每个使用git的人都会从这里开始分支。当您需要从svn获取更新时,您只需执行git-svn rebase然后执行git merge --squash从svn分支到新的“trunk”。反之亦然。这意味着你在svn repo上的历史与git中的最新情况不符。当你做多次合并时,在某些时候你将不得不开始嫁接提交,因为历史不匹配。但是,如果您将git trunk的HEAD移植到最后一个被压缩合并的提交ID,您将获得相同的效果。
好的,让我以最好的方式打破这个例子。
svn repo: 的svn://xyz.com/myproject
git svn clone svn://xyz.com/myproject
这应该为您提供一个正常的git-svn设置,其主分支与svn存储库具有相同的历史记录。
git checkout -b git_trunk
git_trunk成为git用户的“trunk”。
这个分支可以像任何其他git存储库一样自由使用。
现在你需要通过git merge --squash
来同步这两个分支例如..从主svn分支合并到git_trunk
git checkout git_trunk
git merge --squash master
git commit -a
为了从git_trunk合并到master svn,你会做同样的事情 除了你会执行
git svn dcommit
这将把它推回到svn。
因此,复杂的部分是因为我们使用--squash,合并历史记录丢失了,唯一共同的祖先git将会知道的是分支点。这将意味着合并冲突。我解决它的方式是做这样的事情
从git_trunk合并到master。首先,我在git_trunk上获取最后一次压缩的提交ID。让我们称之为ABCDEFG。然后我得到了git_trunk的commit-d。让我们说它的HIJKLMNO
echo "HIJKLMNO ABCDEFG" > .git/info/grafts
这将告诉git何时合并最常见的祖先是最近被压扁的提交。
它并不完美,但对我来说效果很好。特别是现在因为几乎所有人都在使用git。
答案 3 :(得分:2)
我对git-svn的体验是,对于那些希望拥有类似git的subversion repo界面的git用户来说,它主要是有用的。同化git的概念和git-svn的局限性至少对我来说太过分了。
如果可以,我建议您完全切换到git。
我见过很多人抱怨Subversion,但据我所知,它相当稳定。你确定你没有遇到硬件问题吗?
答案 4 :(得分:1)
如果用法是:
git-svn
:您可以直接在subversion工作区的分支内“git init
”并直接在该部分内进行git hack你的代码。但如果是这样的话:
git-svn
将重现“SVN分支”(实际上是包含副本的简单目录),因此我建议使用svn2git
and git2svn
答案 5 :(得分:1)
我认为对git的改变不会解决你的问题。如果你的工作人员中有“非程序员”,他们会破坏其他人的工作副本(我假设通过重命名/删除目录或文件)。
如果您将使用git-svn或git或其他任何VCS并且人们仍然重命名/删除他们的目录,那么这应该如何变得更好?
我认为您应该尝试培训一些人了解VCS的基本概念。
如果人们不了解SVN工作流程,我怀疑他们会掌握git-svn或git。
答案 6 :(得分:0)
我可以毫不费力地将所有svn存储库迁移到git,保留历史记录和其他所有内容,而不是完全切换到git。
2Gb对于单个存储库来说非常重要。将它分成几个部分可能值得吗?
答案 7 :(得分:0)
Tom Preston-Werner,Chris Wanstrath和Scott Chacon -Git,GitHub和社交编码: http://developer.yahoo.com/yui/theater/video.php?v=prestonwerner-github