我继承了一个由许多模块组成的旧CVS项目。这种拆分模块主要是历史的,逻辑上它们属于一体。 我想将其切换到GIT项目。 git cvsimport似乎仅限于转换一个模块,但我不想将GIT子模块用于CVS模块 - 开销太大。
我简单地研究了cvs2git - 它似乎有效,但是它为标签创建了许多虚假提交(好吧,有些CVS标签没有涵盖整个CVS源代码树)。
我听说的另一个工具是裁缝 - 但我根本无法让它工作。
还有其他建议吗?
答案 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以融合历史在一起。
这种融合并没有完全成功(剩下一些重叠),但它足以跟上历史。