3

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

我已经简要地研究了 cvs2git - 它似乎工作,但它为标签创建了许多虚假提交(好的,一些 CVS 标签不覆盖整个 CVS 源代码树)。

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

还有其他建议吗?

4

2 回答 2

2

看起来你最好的机会是在你的根模块中声明一个根模块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 的建议

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

或者,您可以查看一些替代导入器,例如 parsecvs 或 cvs2git。我不知道他们是否会更好地处理这种情况。

作为一个超级 hacky 的替代方案,您可以单独导入每个模块,然后使用 git-filter-branch 将它们拼接在一起。

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

于 2014-01-15T14:37:20.703 回答
0

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

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

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

这种融合并没有完全成功(还有一些重叠),但它足以遵循历史。

于 2014-08-13T09:05:36.517 回答