作为另一种尝试,我正在尝试将 CVS 存储库转换为 GIT。推荐使用cvs-fast-export。唯一的问题是,我不知道该怎么做。我已经构建了它,但是我该如何调用它呢?这里解释了很多标志,但这比帮助更令人困惑。
是否有关于实际转换过程的简短解释?
存储库是远程的,我通常通过 SSH 进入。我不确定这个项目的文件夹结构是否正常。它大致是这样的:
(在远程服务器上)/somefolder/cvs/anotherfolder/
包含:CVSROOT repo-I-want-to-clone-name
repo-I-want-to-clone-name 包含一个
Attic
, 以及,v
后面的所有源代码文件。(没有 CVSROOT)CVSROOT 包含一个
Attic
, cleanlog.sh, cvsignore, checkoutlist, checkoutlist,v, editinfo, editinfo,v, commmitinfo, loginfo, taginfo, 等等(这里没有像文件这样的源代码)
您需要有一个 CVS 存储库目录的本地副本(包含所有
,v
带有历史日志的 RCS 文件)。如果您有 SSH 访问权限,请使用它通过 sftp/rsync/tar 下载文件。如果你只有一个 pserver URL,你需要使用类似cvssuck
生成本地存储库的东西。如果存储库托管在 SourceForge,您可以使用 rsync 下载整个内容。获得 RCS 文件后,将文件名列表提供给 cvs-fast-export,它将以中间“Git fast-export”格式输出一个存储库
注意:确保包含任何
Attic
目录,因为它们包含旧提交中存在但最终被“删除”的文件。(然而,除此之外,不需要额外的元数据文件——每个
,v
文件都是完全独立的,因为它使用与 RCS 相同的单文件历史格式。cvs-fast-export 的工作是混合这些单独的文件历史以某种方式进入多文件提交。)然后,您可以使用
reposurgeon
(例如分配作者、压缩拆分提交)对转储进行编辑,最后使用以下方法将其导入 Git:导入将生成分支和提交,并将更新工作树索引,但显然不会自己提取工作树文件:使用
git reset --hard
或git checkout -f
执行此操作。(理论上,相同的“快速导出”转储也可以由各种其他 SCM(例如 Mercurial、Plastic 或 Bzr)导入。)
以下是我如何转换和验证
repos
名为usingcvs-fast-export
on Ubuntu 18.04的 CVS 存储库。执行转换
首先,从 CVS 创建一个“快速导出”文件:
将快速导出文件导入 Git:
git fast-import
创建一个裸 Git 仓库,所以检查工作文件:验证转换
使用未扩展的关键字创建 CVS 工作副本:
递归修剪空目录,这些目录不会出现在 Git 版本中:
上面给出了每个非空目录的错误,但这很好。
比较 CVS 最新版本和 Git 最新版本:
这是我刚刚用于长时间延迟迁移的有效工具:
https://github.com/rcls/crap