У нас есть очень большое древнее плоское репо CVS с примером формата, как показано ниже. Я импортировал каждый subdir как его собственное git-репо с полной историей.
.
├── 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-й версии программы и установить соответствующие подмодули для каждой версии. Для обратной совместимости, а также в качестве примера для руководства о том, как это будет работать.