2012-02-16 96 views
3

我们有一个非常大的古代平CVS回购,其示例格式如下。我已经导入每个subdir作为自己的git回购与完整的历史。使用子模块将'CVS时代'回购转换为git回购

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

让说,3个方案以如下方式使用库:

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

由于CVS允许标记树的一部分 - 我们标记每个库和程序发布了版本标签。例如liba_4x23,prog3_2x22

我们还与图书馆的每一个版本,它使用的版本标记的程序(即liba_3x19libc_7x88

如果我们发布程序的新版本没有库标签 - 标签停留在程序的最早版本它被使用了。
现在由于道路git的进口作品 - 它实际上是在程序的最新版本结束了(不要担心,虽然)

Git的子模块似乎是这是一个非常好的解决方案 - 一个版本可以检出一个程序,并将所有正确版本的库作为子模块进行抽取。

现在因为当前所有的程序都在不同版本的库中 - 我需要在特定版本上改进子模块。

  • prog1libb_4x50
  • prog2链接与libb_4x70

假设libb_4x70链接是最新的版本则prog2的例子是容易

git checkout prog2 
cd prog2 
git submodule add libb 
.... done 

那么如何libb标记添加与版本(不麸皮ched)4x50prog1?如果您有:-)

一个更好的想法是什么,我们可能还需要做的就是回去3版本的程序,并设置相应的子模块为每个版本

其他方面的建议表示赞赏。无论是向后兼容还是管理它如何工作的例子。

回答

4

子模块(如explained here)的想法是在父回购中记录特定的提交。

因此,所有你需要做的是,加入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”)

+0

谢谢。 “子模块的想法是在父回购中记录具体的提交。” - 这正是我想要的结果。这比我想象的更简单。 – 2012-02-16 16:07:51