使用git-svn的优缺点是什么?

时间:2009-08-21 07:50:19

标签: svn git git-svn

我厌倦了颠覆,它不断破坏自己的存储库。因为我很长一段时间都是古怪的并且总是想尝试一下,所以我决定试一试并使用git-svn。但阅读文档我意识到你不能使用它的git awesomeness。你不能使用git-pull,不建议创建本地分支,并且有很多限制。看起来它比直接使用subversion好多了。或者是吗? git-svn对普通svn有什么利弊?

PS 即可。对不起,我不是在问你如何修复我的subversion存储库,我不在乎。一夜之间删除同一目录中的所有.svn和checkout工作正常。我只是想知道git-svn带来什么好处。

8 个答案:

答案 0 :(得分:4)

优点:

  • Git有益的一切:
    • 对所有旧提交的无网络访问
    • 在Git中提交和重新绑定(再次,无网络),然后git svn dcommit将所有更改推送到SVN以进行良好的干净提交
    • 便宜的本地分支(不确定为什么你说这不能很好地工作)
  • 不必过多地处理SVN :)

缺点:

  • 如果您已经知道Git和SVN(即对新的源代码控制用户不太好),那么工作流程会好很多。
  • 如果他们看到你正在做的事情
  • ,会让其他人感到困惑
  • SVN的某些功能(例如svn:keywords)不可用/方便

答案 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)

如果用法是:

  • “我们保留SVN,但有Git用于快速内部分支”,不需要使用git-svn:您可以直接在subversion工作区的分支内“git init”并直接在该部分内进行git hack你的代码。

但如果是这样的话:

  • “我们维护一个中央SVN仓库和一个Git仓库”,然后事情有点复杂,因为:
    • 一个简单的git-svn将重现“SVN分支”(实际上是包含副本的简单目录),因此我建议使用svn2git and git2svn
    • 尝试在一个Git存储库中导入所有并不总是一个好主意(参见“What are the git limits?”):如果您的系统由可以独立开发的不同模块组成另外,它们可以存在于一个SVN中央存储库中,但它们应该有各自的Git存储库(为了能够只提取所需的模块)。

答案 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