Как импортировать и обновлять 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
,