提问人:jerkstorecalled 提问时间:8/31/2023 最后编辑:jerkstorecalled 更新时间:9/8/2023 访问量:39
从 CVS 迁移到 git,同时保留多个模块的历史记录?
Migrating from CVS to git while preserving history for multiple modules?
问:
我想将旧的 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
...
所以这里的问题是单个分支指定:
- 多次修订
- 单次结账中的不同模块
- 多个检出命令
我不是专家,但它似乎太灵活了,不适合 git,因为您一次只能签出一个分支/标签。
我想要的是:
- 包含 branch1 到 branch5 的 git 存储库
- “git checkout branch3”需要在文件系统上创建与上面所示的 3 个 cvs checkout 命令相同的文件。如果有额外的模块/目录未使用,如果这会让事情变得更容易,那也没关系,但我需要与 CVS 相同的 3 个文件集才能在那里,以便项目构建。
- 保留每个分支的提交历史记录
- 对于不同分支之间相同的提交,它们在 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
答:
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
评论