将具有许多模块的CVS项目转换为一个git存储库的最佳方法是什么?

时间:2012-10-18 12:23:28

标签: git version-control cvs

我继承了一个由许多模块组成的旧CVS项目。这种拆分模块主要是历史的,逻辑上它们属于一体。 我想将其切换到GIT项目。 git cvsimport似乎仅限于转换一个模块,但我不想将GIT子模块用于CVS模块 - 开销太大。

我简单地研究了cvs2git - 它似乎有效,但是它为标签创建了许多虚假提交(好吧,有些CVS标签没有涵盖整个CVS源代码树)。

我听说的另一个工具是裁缝 - 但我根本无法让它工作。

还有其他建议吗?

2 个答案:

答案 0 :(得分:1)

看起来您最好的机会是在CVSROOT/modules中声明根模块并引用其下的所有其他模块:

#M  everything  Composite module which holds all other submodules
everything  &foo \
        &bar \
        &baz

- 然后像往常一样调用git-cvsimport

git cvsimport -k -A authors everything -C my-git-repo

这种方法并不总是对我有用(我收到已知的错误消息WARNING: file foo doesn't match strip_path bar ignoring)。以下是Jeff King suggests

  

作为一个黑客,如果你可以在CVS存储库中移动文件(如果你   不能,尝试使用cvssuck或类似的方法在本地拉它们,然后做   从那里导入),然后将所有内容移动到子模块“foo”,并且   导入该模块。

     

或者,您可以查看一些替代进口商   像parsecvs或cvs2git。我不知道他们是否会处理这件事   情况更好。

     

作为超级黑客的替代方案,您可以导入每个模块   分别然后使用git-filter-branch将它们全部固定在一起。

由于git-cvsimport似乎是唯一支持作者映射的实用程序, 我建议您移动存储库中的文件,然后使用git-cvsimport导入单个模块。

答案 1 :(得分:0)

更新:我继续进行直接的cvs2git调用。我选择保留CVS模块,让野兽运行大约1天。

之后我使用git filter-branch将来自CVS的提交者信息与来自GIT的提交者信息合并 - 这实际上并没有完全完成,我忽略了一些名称,但由于这是一个美学问题,我让它留下来。

为了将旧的CVS回购和新的GIT回购之间的历史拼接在一起,我使用移植物将历史拼接在一起,然后(在创建移植文件之后),我再次运行git filter-branch以融合历史在一起。

这种融合并没有完全成功(剩下一些重叠),但它足以跟上历史。