Преобразование репо 'эры CVS' в репозитории git с субмодулями - PullRequest
3 голосов
/ 16 февраля 2012

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

1 Ответ

4 голосов
/ 16 февраля 2012

Идея субмодулей (как объяснено здесь ) состоит в том, чтобы записать конкретный коммит в родительском репо.

Итак, после добавления 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"

(Комментарий к «detached HEAD» см. в «git submodule update * удаляет незафиксированные файлы *»1012 * ")

...