![如何使用 cvs-fast-export 将 CVS 存储库转换为 GIT?](https://linux22.com/image/1595147/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20cvs-fast-export%20%E5%B0%86%20CVS%20%E5%AD%98%E5%82%A8%E5%BA%93%E8%BD%AC%E6%8D%A2%E4%B8%BA%20GIT%EF%BC%9F.png)
作为另一种尝试,我正在尝试将 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 --hard
或git 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
这是我刚刚用于长期迁移的有效工具: