Как импортировать и обновлять репозиторий CVS в Git?

В CVS есть центральный репозиторий, и я хотел бы использовать его с Git локально, а затем отправить мои изменения обратно в CVS.

Что я могу сделать это ежедневно?

Задачами, которые я хотел бы выполнить, являются:

  • импортировать ветки,
  • получение истории в формате GIT -like и
  • экспорт моих изменений/фиксации на централизованный сервер

Кстати, я также рассмотрел Рекомендации по использованию Git с CVS. Но это не сработало, и я не мог понять, что я пропустил или сделал не так.

Ответ 1

То, что я делал в прошлом, это:

Импортировать репозиторий CVS

Использование:

$ git cvsimport -C target-cvs -r cvs -k -vA authors-file.txt -d $CVSROOT module

Где:

  • target-cvs - это каталог, в котором хранится моя локальная копия репозитория.
  • cvs - это имя, используемое для ссылки на удаленный репозиторий. Итак, у меня будут cvs/master, cvs/HEAD и т.д., Локально обозначенные master.
  • authors-file.txt - это файл, содержащий совпадения между учетной записью CVS и именем + email, каждая строка содержит userid=User Name <[email protected]>
  • $CVSROOT - сервер репозитория CVS. Если я использую анонимное клонирование из некоторого репозитория sourceforge, я бы использовал: :pserver:[email protected]_name.cvs.sourceforge.net:/cvsroot/project_name
  • module - это модуль внутри репозитория, который я хочу клонировать. Если репозиторий имеет только один модуль, то, вероятно, будет таким же, как project_name.

Обновить репозиторий

Можно повторить команду, которую я написал ранее. В этом конкретном примере он должен быть запущен в родительском каталоге target-cvs. Чтобы упростить работу в будущем, вам может понадобиться настроить некоторые переменные (вы можете прочитать более подробную информацию в ответе Как экспортировать историю изменений из mercurial или git в cvs? ")

$ git cvsimport

Этого было бы достаточно, чтобы локальный репозиторий в git был синхронизирован с удаленным в CVS.

Ежедневная работа

Отныне каждое изменение должно идти в локальной ветки git. Одна особенность, одна ветвь. Для этого я использую рабочий поток, описанный в успешная git ветвящаяся модель". Единственное отличие состоит в том, что мастер указывает на CVS, но концептуально здесь могут применяться те же рабочие потоки. Это просто соглашение.

Как только ваша фиксация будет нажата в CVS, она вернется к следующему обновлению (git cvsimport). Затем вы можете удалить локальную ветвь, которая реализовала эту функцию.

Для незавершенного производства (в локальных ветвях) вы должны rebase их против хозяина. Поскольку у вас есть функции, разделяемые, нужно будет легче разрешать конфликты. Трудная часть заключается в том, что некоторые ветки зависят от других, но все же управляемы. Микрокоманды помогают много (как в любом рабочем процессе git).

Если каждая локальная ветвь переустанавливается и мастер никогда не касается (кроме обновлений), тогда git cvsexportcommit должен работать. Помните, что он работает для одного фиксации. Это немного утомительно, но это лучше, чем ничего. Учитывая предыдущий пример, команда должна выглядеть примерно так:

$ git cvsexportcommit -vc commit-id

Если у вас есть доступ только для чтения к удаленному CVS, вы можете отправлять исправления по электронной почте или публиковать публичный репозиторий git, поэтому участники могут захватить ваши патчи для их применения. В этом случае ничто не отличается от нормального рабочего потока CVS. Опять же, в следующем обновлении вы увидите изменения в master.

Ответ 2

С последней версией git cvsimport не работает, из-за cvsps несовместимости инструмента.

Итак, вы должны установить cvsps-2.1.

В OSX вы можете (имея brew):

brew tap homebrew/versions
brew install cvsps2
brew unlink cvsps
brew link --overwrite cvsps2

И импортировать в пустой репозиторий git, как обычно, например:

git cvsimport -C RepoName -r cvs -o master -k -v -d:pserver:[email protected]:/cvsroot/path ModuleName

Вы также можете использовать инструмент cvs2git, который может конвертировать репозиторий CVS в git. Однако вам необходимо иметь доступ к каталогу CVSROOT.

Отметьте документацию cvs2git для шагов установки.

Пример использования:

cvs2git --blobfile=git-blob.dat --dumpfile=git-dump.dat --username=cvs2git /path/to/cvs/repo

Это создаст два выходных файла в формате git fast-import. Имена этих файлов задаются параметрами или аргументами командной строки. В этом примере эти файлы называются cvs2git-tmp/git-blob.dat и cvs2git-tmp/git-dump.dat.

Эти файлы можно импортировать в пустой репозиторий git:

cat git-blob.dat git-dump.dat | git fast-import

Затем удалите ветвь TAG.FIXUP и запустите gitk --all, чтобы просмотреть результаты преобразования.

Проверьте больше, выполнив: cvs2git --help.

Ответ 3

Я считаю, что в вашем случае нет готового рецепта. Но вы можете попробовать следующее:

  • Вручную синхронизировать данные CVS с Git или писать сценарии для этого. Они получат информацию из CVS и поместите ее в Git. Это даст вам некоторую историю в Git. Не полностью чистая, не полностью пригодная для использования, но все же.
  • Перенесите репозиторий CVS на Git с помощью инструментов, например git cvsimport. И попросите Git притвориться CVS для других разработчиков, используя git cvsserver.