我们目前正在考虑从svn迁移到git以获取git提供的所有好处的选项。我们目前担心失去历史并调查此问题。我们想知道当他们从svn迁移到git时是否还有其他问题。
答案 0 :(得分:6)
关于丢失历史,从svn转换为git应该没有任何问题。无论如何,这是修订控制软件的主要目的,以跟踪历史。
当然,最重要的规则是:在转换它们之前始终备份您的存储库并进行多次测试运行,直到您有足够的信心在生产环境中执行它。
与git子模块相比,主要区别在于Subversion的外部行为方式。 参见:
此外,期望花一些时间来支持用户。 Git是一个不同的野兽,一些习惯的svn用户可以发现使用它有点不直观。
编辑:Git使用git-svn内置了对导入和使用svn存储库的支持。
答案 1 :(得分:4)
Git-SVN将所有Subversion历史记录(和一些其他元数据)导入Git仓库
git svn clone url://path/to/repo -s
-s如果你在Subversion中有“标准”repo-layout
但有些作家建议使用
git svn init -s http://example.com/svn/my_proj
git svn fetch
一些额外有用的阅读:
答案 2 :(得分:4)
SVN中存在非标准分支或标签时出现的问题最多。这是有人没有将trunk/
文件夹复制到tags/
或branches/
,而只复制到它的子文件夹。这些文件夹显示为“ripped off”修订版,没有带有trunk的共同祖先。但内容自我是正确的。
答案 3 :(得分:1)
我能够使用我在这里写的脚本将带有分支历史的svn历史迁移到git存储库:
https://github.com/onepremise/SGMS
您可以支持这两种格式:
/trunk
/Project1
/Project2
/branches
/Project1
/Project2
/tags
/Project1
/Project2
此方案也很受欢迎并得到支持:
/Project1
/trunk
/branches
/tags
/Project2
/trunk
/branches
/tags
答案 4 :(得分:1)
Subversion和Git在如何表示历史,保留元数据,处理系统特定问题方面存在很大差异。这种差异导致了大多数陷阱:
Git中缺少合并提交:
Subversion将有关已执行合并的信息保存为文件和目录上的svn:mergeinfo属性。在转换为Git时,关于子树合并和樱桃选择的信息会丢失,因为Git无法代表它。
另见After “git svn clone”, I still don't have fantastic branch-merging commit?
外部和子模块:
添加到@Sundae's answer:看看SmartGit - 此工具实际上可以导入svn:externals。它使用的是其他Git客户端不支持的特殊格式的文件。
空目录:
Subversion将目录视为一等公民,Git没有 - 必须添加一些占位符文件以在转换时保留目录。 git-svn尝试使用外部存储“未处理的日志”来处理这个问题,但只有在转换后继续使用git-svn时才有效。
svn:ignore和.gitignore,svn:eol-style / mime-type和.gitattributes:
git-svn不会自动将Subversion属性转换为相应的.gitattributes。必须在转换后运行特定命令以添加属性 - 无论如何,此信息在转换时会丢失。
任意Subversion属性:
将Subversion存储库转换为Git存储库时,任何自定义文件和修订版属性都将丢失。
看看SubGit。它很好地应对了大多数陷阱,其他的计划在其他版本中修复。
创建SubGit是一个公司范围的迁移工具。可以将它用作一次性转换实用程序,但一般来说它是Subversion和Git连续同步工具。您可以在documentation page上找到更多信息。