转换CVS时代'使用子模块回复git repo

时间:2012-02-16 03:52:33

标签: git cvs git-submodules

我们有一个非常大的古代平面C​​VS回购,其示例格式如下。我已将每个子目录导入为具有完整历史记录的git repo。

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

让我们说3个程序以下列方式使用库:

.
├── 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

那么如何将libb标记为版本(非分支)4x50添加到prog1

如果您有更好的想法,其他建议表示赞赏: - )

我们可能还想做的是返回程序的3个版本并为每个版本设置适当的子模块。用于向后兼容性,也可作为管理如何工作的示例。

1 个答案:

答案 0 :(得分: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”)