我们有一个非常大的古代平面CVS回购,其示例格式如下。我已将每个子目录导入为具有完整历史记录的git repo。
.
├── liba
├── libb
├── libc
├── prog1
├── prog2
└── prog3
让我们说3个程序以下列方式使用库:
.
├── prog1
│ ├── liba
│ └── libb
├── prog2
│ ├── libb
│ └── libc
└── prog3
├── liba
└── libc
因为CVS允许标记树的一部分 - 我们用版本标记标记每个库和程序版本。例如liba_4x23
,prog3_2x22
。
我们还会在发布时使用的每个版本的库中标记该程序(即liba_3x19
libc_7x88
)
如果我们发布没有库标签的程序的新版本 - 标签仍然是使用它的程序的最早版本。
现在由于git导入的工作方式 - 它实际上最终会在程序的最新版本中出现(尽管不要担心)
Git子模块似乎是一个非常好的解决方案 - 可以检出一个程序版本,并将所有正确版本的库作为子模块。
现在所有当前的程序都在不同版本的库中 - 我需要在特定版本中改进一个子模块。
prog1
与libb_4x50
prog2
与libb_4x70
假设libb_4x70
是最新版本,那么prog2
的示例很简单
git checkout prog2
cd prog2
git submodule add libb
.... done
那么如何将libb
标记为版本(非分支)4x50
添加到prog1
?
如果您有更好的想法,其他建议表示赞赏: - )
我们可能还想做的是返回程序的3个版本并为每个版本设置适当的子模块。用于向后兼容性,也可作为管理如何工作的示例。
答案 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”)