2009-08-21 101 views
6

我厌倦了颠覆,它不断腐蚀自己的存储库。由于我一直都很喜欢git,并且总是想尝试一下,所以我决定放手使用git-svn。但通过阅读文档,我意识到你不能使用它的很多git awesomeness。你不能使用git-pull,建议不要创建本地分支,并且有很多限制。看起来好像并不比直接使用Subversion好。或者是? git-svn有什么优点和缺点,而不仅仅是简单的svn?使用git-svn有什么优缺点?

PS。我很抱歉,但我并没有问你如何修复我的Subversion版本库,我并不在乎。一夜之间删除同一个目录下的所有.svn和checkout都可以正常工作。我只是想知道git-svn可以带来什么好处。

+7

你真的不应该得到这样的颠覆性问题。我们在工作中管理的Subversion版本库相当庞大(超过10,000个文件),我们从未遇到任何腐败问题。听起来更像是一个硬件问题,任何腐败都不应该发生。 – Kezzer 2009-08-21 08:02:32

+3

我猜你的版本库不是由非程序员使用:)他们可以破坏任何东西。 – vava 2009-08-21 08:07:39

+0

@vava:非程序员可能会打破他们的_working copy_并失去大量工作,但他们肯定不应该破坏_repository_。在那里似乎有些鱼腥味,如果我是你,我会试着在做其他事情之前弄清楚这是怎么发生的。 – sbi 2009-08-21 09:06:47

回答

4

优点:

  • 一切,Git是很好的:
    • 免费网络访问到所有的老款
    • Commit和Git中(再次,网络免费),然后git svn dcommit推动所有一个不错的改变SVN变基干净的承诺
    • 当地廉价的分支(不知道为什么你说这不工作这么好)
  • 不必使用SVN这么多:)

缺点:

  • 很多更好的工作流程,如果你已经知道,这两个Git和SVN(即不那么新的源代码控制用户良好)
  • 会迷惑其他人,如果他们看到你在做什么
  • 一些SVN的功能(例如svn:关键字)无法使用/方便
+0

我被迫在大学使用SVN,并且仍然倾向于使用Git与SVN桥接器。也就是说,在SVN超出等式之前,您无法充分利用Git。 – 2009-08-21 10:18:05

2

我对git-svn的使用经验是,它主要用于(经验丰富的)git用户,他们希望拥有一个类似于git的界面到subversion repo。同化git概念和git-svn的局限性至少对我来说太过分了。

如果可以,我建议您完全切换到git。

我见过很多人抱怨Subversion,但据我所知它相当稳定。你确定你没有硬件故障吗?

+0

是的,我确定:)当文件名太长或连接在提交中间向南时,它有时会中断。处理2GB存储库对于糟糕的颠覆并不容易。太糟糕了,我无法完全切换到git。 – vava 2009-08-21 08:02:45

+0

您是否要求在SVN邮件列表中寻求帮助?我敢打赌他们会对这些问题非常感兴趣。 – sbi 2009-08-21 09:07:47

+0

这是没用的,我没有一个测试用例来显示它们。 – vava 2009-08-21 09:21:37

0

我可以看到没有任何问题将所有svn存储库迁移到git,保存历史和其他所有内容,并且完全切换到git。

2Gb对于单个存储库来说非常重要。将它分成几部分可能值得吗?

+0

不幸的是,我不是唯一的员工:)而那些非程序员的人可以在某种程度上理解Tortoise SVN,git会对他们太苛刻。所以迁移到git不是一个可悲的选择。 – vava 2009-08-21 08:18:42

1

如果用法是:

  • “我们保持SVN,但有Git的快速内部分支”,没有必要使用git-svn:你可以“git init”直接在你的Subversion工作区和Git黑客的一个分支直接在您的代码部分。

但是,如果是这样的:

  • “我们同时维持中央SVN回购和一个Git回购”,那么事情有点复杂,因为:
    • 简单git-svn将重现“SVN分支”(实际上简单的目录中有副本),所以我会建议使用svn2git and git2svn
    • 试图导入一切在一个Git仓库中并不总是一个好主意(请参阅“What are the git limits?”):如果您的系统由不同的模块组成,这些模块可以彼此独立开发,它们可以存在于单个SVN中央存储库中,但它们应该有各自的Git回购(在为了能拉你只需要的模块)
1

我觉得变化的git不会解决你的问题。如果你的工作团队中有“非程序员”,他们会打破他人工作副本(我假设通过重命名/删除目录或文件)。

如果您将使用git-svn或git或其他VCS和其他人仍然重命名/删除他们的目录,应该如何更好?

我认为你应该尝试培养一些人来理解VCS的基本概念。

如果人们不理解SVN工作流程,我怀疑他们会掌握git-svn或git。

+0

这就是为什么我想隐藏在git-svn后面:)我不确定这一点,但我想git只是更先进,不会轻易破解。 – vava 2009-08-21 12:34:47

+0

如果你疯狂地删除和重命名文件并尝试合并,git-svn会引入更多的复杂性并且会像svn一样容易分解。你真的应该寻找你的问题的根源。 – 2009-08-21 12:43:10

3

这些是使用git-svn的专业pro和con。所以这不是关于git本身。

的使用SVN人的倾向是一次性提交大的变化,因为你需要提交过线。这种方法可能很糟糕,因为有时这些更改可能与彼此不相关。例如:您可以对错误修正进行更改,并更改一个变更集上提交的新功能。使用git,我可以经常提交给我的本地git存储库(特别是当我没有连接到网络时)并且尽可能小的变更集。然后,我承诺svn(使用'git svn dcommit')当整个大变化准备就绪。

精读

具有svn的作为远程储存库被合并,尤其是当有冲突的CON。有时可能会很痛苦。我使用IntelliJ作为我的IDE并解决冲突,我必须去命令行解决它。知道我经常遇到这个问题,I have documented it,现在它不再成为一个大问题对我来说。

+5

你的链接已死亡。 – 2011-11-11 08:13:46

3

我使用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。

+0

所以,你制作了一个公共的git仓库,每个喜欢这个git的人都在使用它,并且偶尔会把所有这些人的变化都提交到主Subversion中。在svn上离开的穷人不能再使用责备:) – vava 2009-08-23 02:24:44

相关问题