从 CVS 迁移到 git,同时保留多个模块的历史记录?

Migrating from CVS to git while preserving history for multiple modules?

提问人:jerkstorecalled 提问时间:8/31/2023 最后编辑:jerkstorecalled 更新时间:9/8/2023 访问量:39

问:

我想将旧的 CVS 存储库迁移到 git,同时保留历史记录。

以下是我如何查看 CVS 中需要迁移的 5 个分支:

branch1:
cvs co -r branch1 sim Login SystemMonitor archiver

branch2:
cvs co -r branch2 par sim Login archiver
cvs co -r branch2_redux editor

branch3:
cvs co -r GEN3 par sim SystemMonitor archiver
cvs co -r GEN3_update1 tms editor
cvs co -r GEN3Sim
...

所以这里的问题是单个分支指定:

  1. 多次修订
  2. 单次结账中的不同模块
  3. 多个检出命令

我不是专家,但它似乎太灵活了,不适合 git,因为您一次只能签出一个分支/标签。

我想要的是:

  1. 包含 branch1 到 branch5 的 git 存储库
  2. “git checkout branch3”需要在文件系统上创建与上面所示的 3 个 cvs checkout 命令相同的文件。如果有额外的模块/目录未使用,如果这会让事情变得更容易,那也没关系,但我需要与 CVS 相同的 3 个文件集才能在那里,以便项目构建。
  3. 保留每个分支的提交历史记录
  4. 对于不同分支之间相同的提交,它们在 Git 中也应该相同。例如,登录模块的前 75% 的提交在所有分支中都是相同的,因此我希望它们在 git 中具有相同的 SHA。

这是可以实现的吗,如果可以,如何实现?

我已经尝试过的我成功地在存储库上运行了cvs2git(非常长的10个小时)。我最终得到了像 branch1、branch2、branch2_redux、GEN3、GEN3_update1、GEN3Sim 这样的分支(-r 标志)。但是,我不确定我应该如何将 GEN3+GEN3_update1+GEN3Sim 的历史记录和文件合并到一个分支中3。

这是我用来转换存储库的命令:

cd ~
rsync -avz myusername@cvsserver:/path/to/cvsrepo/ ./cvsrepo_local_copy/
cvs2git --blobfile=~/git-blob.dat --dumpfile=~/git-dump.dat --username=cvs2git ~/cvsrepo_local_copy
mkdir new_git_repo && cd new_git_repo && git init
cat ~/git-{blob,dump}.dat | git fast-import
git cvs cvs2svn cvs2git

评论

0赞 Adrian J. Moreno 9/1/2023
这回答了你的问题吗?如何在 Git 中导入和更新 CVS 存储库?
0赞 jerkstorecalled 9/1/2023
一点也不。将单个模块导入 git 是微不足道的,我已经解决了这个问题。问题是 git 和 CVS 之间的根本区别:我需要对多个模块的多个分支进行多次 CVS 检出才能在我的文件系统上获得正确的源代码,而 git 只允许您执行单个“git 检出操作”。
0赞 Mort 9/16/2023
你试过我建议的答案吗?

答:

0赞 Mort 9/7/2023 #1

我建议先修改(复制)CVS 存储库,然后运行 cvs2git。

这些文件只是文本文件,没有校验和或任何内容,因此您可以编辑它们。,v

像这样,对所有要标准化为基本分支名称的分支进行操作。

find editor -type f -name '*,v' | xargs sed -i -e 's/branch2_redux/branch2/g'

一旦你这样做了,你所有的 “branch2*” 分支都应该被称为 “branch2”,当你运行 cvs2git 时,所有文件都应该按照你的意愿在同一个分支上一起创建。

评论

0赞 jerkstorecalled 9/20/2023
我想尝试一下,但是 OP 的示例不包括一个问题,即某些项目检出未提及特定分支名称的模块。例如,“cvs co gui”,以及特定于分行的结账。因此,独立的“gui”在多个项目中被检出(尽管一些较旧的分支保留了较旧的“gui”)。在没有明确的分支名称的情况下,我该怎么办?
0赞 Mort 9/22/2023
如果你不关心历史,你可以在转换后将模块的代码提交到每个分支。或者它可能只是一个单独的模块,使用 git 子模块;这听起来有点像所涉及的用例。gui