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

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

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

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

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

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

3 ответа

Решение

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

Импортируйте репозиторий 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 и именем + адрес электронной почты, каждая строка содержит userid=User Name <useremail@hostname>
  • $CVSROOT сервер хранилища CVS Если бы я использовал анонимное клонирование из какого-то репозитория sourceforge, то я бы использовал: :pserver:anonymous@project_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 их против хозяина. Поскольку у вас есть отдельные функции, вам будет легче разрешать конфликты. Сложная часть - это когда одни ветви зависят от других, но все же управляемы. Micro commits очень помогает (как в любом рабочем процессе git).

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

$ git cvsexportcommit -vc commit-id

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

С последней версией 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:anonymous@reponame.cvs.sourceforge.net:/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,

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

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