如何使用 cvs-fast-export 将 CVS 存储库转换为 GIT?

如何使用 cvs-fast-export 将 CVS 存储库转换为 GIT?

作为另一种尝试,我正在尝试将 CVS 存储库转换为 GIT。cvs-快速导出被推荐。唯一的问题是,我不知道如何实际做到这一点。我已经构建了它,但我该如何调用它?有很多标志解释这里但这带来的困惑比帮助更大。

是否有关于实际转换过程的简短解释?

该存储库是远程的,我通常通过 SSH 进入。我不确定这个项目的文件夹结构是否正常。它大致如下所示:

  • (在远程服务器上)/somefolder/cvs/anotherfolder/

  • 包含:CVSROOT repo-I-want-to-clone-name

  • repo-I-want-to-clone-name 包含一个,以及其后的Attic所有源代码文件。(无 CVSROOT),v

  • CVSROOT 包含Attic、cleanlog.sh、cvsignore、checkoutlist、checkoutlist,v、editinfo、editinfo,v、commmitinfo、loginfo、taginfo 等。(这里没有类似源代码的文件)

答案1

您需要有 CVS 存储库目录的本地副本(包含所有 RCS,v文件和历史记录)。如果您有 SSH 访问权限,请使用它通过 sftp/rsync/tar 下载文件。如果您只有 pserver URL,则需要使用类似的东西cvssuck来生成本地存储库。如果存储库托管在 SourceForge 上,您可以使用 rsync 下载整个存储库。

获得 RCS 文件后,将文件名列表提供给 cvs-fast-export,它将以中间“Git fast-export”格式输出存储库

cd ~/cvsfiles
find . -name '*,v' | cvs-fast-export [some options] > ~/converted.fe

笔记:确保包含所有Attic目录,因为它们包含存在于旧提交中但最终被“删除”的文件。

(除此之外,不需要额外的元数据文件——每个,v文件都是完全独立的,因为它使用与 RCS 相同的单文件历史格式。cvs-fast-export 的工作是以某种方式将这些单个文件历史记录混合到多文件提交中。)

然后,您可以使用以下命令对转储进行编辑reposurgeon(例如,分配作者、压缩拆分提交),最后使用以下命令将其导入 Git:

git init ~/result
cd ~/result
git fast-import < ~/converted.fe

导入将生成分支和提交,并将更新工作树索引,但显然不会提取工作树文件本身:使用git reset --hardgit checkout -f来执行此操作。

(理论上,相同的“快速导出”转储也可以被其他各种 SCM(例如 Mercurial、Plastic 或 Bzr)导入。)

答案2

以下是我转换并验证我的 CVS 存储库名为在 Ubuntu 18.04 上repos使用。cvs-fast-export

执行转换

首先,从 CVS 创建一个“快速导出”文件:

sudo apt install cvs-fast-export

cd repos/    # The CVS repository
find . | cvs-fast-export -kb > ../repos.fe

将快速导出文件导入到Git:

cd ..
git init repos.git
cd repos.git
git fast-import < ../repos.fe

git fast-import创建一个裸 Git 仓库,因此检查工作文件:

git checkout -f

验证转换

创建未扩展关键字的 CVS 工作副本:

cd ..    # Directory in which you started
export CVSROOT=$PWD/repos
mkdir checkout-cvs
cd checkout-cvs
cvs co -kb `(cd ../repos; ls | grep -v CVSROOT)`

递归地修剪空目录,这些目录不会出现在 Git 版本中:

find . -type d | sort -r | xargs rmdir

上述操作会为每个非空目录给出错误,但这没问题。

将 CVS 最新版本与 Git 最新版本进行比较:

cd ..
diff -r  checkout-cvs repos.git

答案3

这是我刚刚用于长期迁移的有效工具:

https://github.com/rcls/crap

相关内容