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

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

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

Я хотел бы решить следующие задачи:

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

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


person Jatin Ganhotra    schedule 06.07.2012    source источник
comment
Вы должны объяснить, почему git-cvsimport у вас не работает. Также для этого вопроса git-svn совершенно не имеет отношения (или предоставьте ссылку, если есть инструмент svn-git, который имеет дело с CVS).   -  person Benjamin Bannier    schedule 09.07.2012
comment
@honk, я считаю, что git-cvsimport - это билет в Git только в один конец   -  person shytikov    schedule 11.07.2012
comment
@AlexeyShytikov, есть еще git-cvsexportcommit, чтобы разместить вашу работу в репозитории CVS. Хотя он и не такой классный, как git-svn, он все же гораздо более полезен, чем простой CVS.   -  person Benjamin Bannier    schedule 11.07.2012
comment
@ Здравствуйте, вы правы, я упустил этот момент.   -  person shytikov    schedule 12.07.2012
comment
Я действительно не могу понять, почему это нужно закрыть. основанный на мнении? Как копировать исходный репозиторий туда и обратно?   -  person Albert van der Horst    schedule 23.10.2017


Ответы (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 модель ". Единственная разница в том, что master указывает на CVS, но концептуально здесь можно применить те же рабочие процессы. Это просто условность.

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

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

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

$ git cvsexportcommit -vc commit-id

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

person gpoo    schedule 15.07.2012
comment
Мне пришлось установить cvsps на OSX (brew install cvsps). Однако он сломан из-за cvsps: bad usage: invalid argument --norc. ошибки. Это происходит с cvsps 3.x (опция была удалена), возможно, понижение до 2.x может сработать, но это может вызвать другие проблемы. - person kenorb; 18.03.2015
comment
@kenorb: git-cvsimport не работает с csvps 3.x, но с 2.x. Чтобы установить более раннюю версию csvps, запустите brew uninstall cvsps; brew install https://raw.githubusercontent.com/Homebrew/homebrew/5a0b551194b5cf8017478432f8f7e63a77c12bd1/Library/Formula/cvsps.rb ПРИМЕЧАНИЕ. Я слепой. Не видел вашего ответа ниже - person Andrei Neculau; 25.06.2015
comment
Страница руководства cvsimport полна предупреждений. , устаревшие и другие предупреждения. Вместо этого он рекомендует использовать cvs2git. - person Edward Falk; 14.04.2016
comment
Конечно, через 4 года после первоначального ответа. - person gpoo; 14.04.2016
comment
Иногда ответы нужно изменять, когда появляется новая информация. - person Edward Falk; 18.04.2016
comment
Согласованный. Поскольку любой может их редактировать, лучше прокомментируйте это, вы могли бы это отредактировать. не мог бы ты? - person gpoo; 19.04.2016
comment
к сожалению, устаревший - person tObi; 05.05.2017
comment
В Windows я получаю git: 'cvsimport' не является командой git. - person Anthony; 30.06.2020

В последней версии 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.

person kenorb    schedule 18.03.2015
comment
brew tap homebrew/versions бросает Error: homebrew/versions was deprecated. This tap is now empty and all its contents were either deleted or migrated. сейчас - person Pioneer Skies; 09.04.2021

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

  • Синхронизируйте данные CVS с Git вручную или напишите для этого сценарии. Они получат информацию из CVS и поместят ее в Git. Это даст вам некую историю в Git. Не полностью чистый, не полностью пригодный для использования, но все же.
  • Перенесите репозиторий CVS в Git с помощью инструментов, например git cvsimport. И попросите Git притвориться CVS для других разработчиков, используя git cvsserver.
person shytikov    schedule 10.07.2012
comment
Вот история успеха перехода на Git из CVS: stackoverflow.com/q/9609943/1047741 - person shytikov; 11.07.2012