将“CVS era”存储库转换为带有子模块的Git存储库

3

我们有一个非常大的古老的扁平CVS仓库,格式示例如下。我已将每个子目录作为自己的git仓库导入,并保留了完整的历史记录。

.
├── liba
├── libb
├── libc
├── prog1
├── prog2
└── prog3

假设这三个程序使用库的方式如下:
.
├── prog1
│   ├── liba
│   └── libb
├── prog2
│   ├── libb
│   └── libc
└── prog3
    ├── liba
    └── libc

由于CVS允许对树的部分进行标记,我们会使用版本标记来标记每个库和程序的发布。例如:liba_4x23prog3_2x22
我们还会在程序中标记其使用的每个库的所有版本,即liba_3x19 libc_7x88
如果我们发布一个新版本的程序没有附带库标记,则该标记将保留其所用最早版本程序的标记。
现在由于git导入的方式,它实际上会到达程序的最新版本(不太担心这一点)
Git子模块似乎是这个问题的非常好的解决方案-程序的某个版本可以被检出并将所有正确版本的库作为子模块引入。
现在由于所有当前程序都处于不同的库发布版本中,因此我需要在特定版本中重新装配子模块。
  • prog1libb_4x50链接
  • prog2libb_4x70链接
假设libb_4x70是最新版本,则prog2的示例很容易。
git checkout prog2
cd prog2
git submodule add libb
.... done

如何将版本为4x50的libb添加到prog1中?

如果您有更好的想法,欢迎提出其他建议 :-)

我们可能还想做的是回退程序的3个版本,并为每个版本设置适当的子模块。这样可以实现向后兼容,并向管理层展示其工作原理。

1个回答

4
子模块的概念(如此处所解释)是在父存储库中记录特定提交的想法。
因此,您所需要做的就是,在添加libb后,检出正确的标签,然后将该新状态记录在父存储库中。
git checkout prog1
cd prog1
git submodule add libb
cd lib
git checkout libb_4x50 # make sure to make a branch 
                       # if you want to do any modification
                       # based on libb_4x50,
cd ..
git add -A .
git commit -m "fix correct libb version"

(关于“游离的HEAD”注释,请参见“git submodule update * deletes uncommitted files”)

“子模块的概念是在父存储库中记录特定提交。”- 这正是我想要的结果。这比我想象的要简单。谢谢。 - Adrian Cornish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接