Есть ли инструмент переноса из CVS в Git?

Я намерен переключиться с CVS на Git. В случае SVN, как представляется, cvs2svn. Есть ли аналогичный инструмент для легкой миграции из CVS в Git?

Ответ 1

Единственный инструмент, который имеет инкрементный импорт, выглядит как git-cvsimport. Если вы хотите преобразовать (migrate) из CVS в Git, лучшее решение на данный момент, как представляется, указано выше cvs2git mode cvs2svn.

См. также Страница "Интерфейсы Frontfaces And Tools" на странице Git wiki, раздел о взаимодействии с другими системами контроля версий.

Ответ 2

cvs2git

В дополнение к предоставленным ответам, здесь приводится руководство по преобразованию cvs в git с помощью инструмента cvs2git. Здесь modulename - это имя каталога CVS, который вы хотите импортировать.

Предпосылки

cvs2svn пакет (который включает команду cvs2git) должен быть уже установлен.

Обновление: шаги 1 и 2 не совсем корректны - перед тем, как попытаться, прочитайте комментарий ниже mhagger, сопровождающий cvs2git

  • checkout modulename

    cvs -d URL co -P modulename
    
  • создать пустой CVSROOT, необходимый cvs2git

    mkdir modulename/CVSROOT
    
  • загрузите пример cvs2git.options в http://cvs2svn.tigris.org/svn/cvs2svn/trunk/cvs2git-example.options (пользователь "гость" без пароля)

  • отредактируйте файл cvs2git.options. Замените r'test-data/main-cvsrepos 'на' modulename '. Редактировать авторы.

    # edit this
    run_options.set_project(  r'modulename',
    
    # and this
    author_transforms={
        'jrandom' : ('J. Random', '[email protected]'),
        'mhagger' : 'Michael Haggerty <[email protected]>',
    
  • запустить cvs2git для создания git temp файлов

    cvs2git  --options=cvs2git.options --fallback-encoding utf-8
    
  • создать git репозиторий

    mkdir gitrepo && cd gitrepo && git init .
    
  • импорт из git файлов temp, созданных cvs2git

    cat ../cvs2git-tmp/git-{blob,dump}.dat | git fast-import
    
  • проверка рабочей копии

    git reset --hard
    

Ответ 3

cvs2svn имеет cvs2git.

Ответ 4

Если у кого-то еще есть несчастье использовать CVS, вы можете попробовать "crap": https://github.com/rcls/crap Он быстрый (поскольку доступ к CVS может быть быстрым), поддерживает беспорядок, который вы находите в cvs-репозиториях, и инкрементный.

Ответ 5

Альтернативой может быть использование git cvsimport *

Ответ 6

Я не пробовал это сам, но друзья сообщили о хорошем успехе, преобразовании сначала из CVS в SVN, а затем из SVN в Git. Похоже, что инструменты для этих соответствующих переходов были более тщательно измучены, чем прямой переход CVS к Git.

Ответ 7

Вы можете добавить fromcvs в список. Он хорошо преобразуется и работает очень быстро, а также инкрементально. Однако он не содержит липких тегов, а только ветки.

Ответ 8

Я пробовал cvs2git, git -cvsimport и parsecvs.

cvs2git иногда (насколько я помню) создает фиктивные ветки для тегов.

git -cvsimport не поддерживает несколько тегов для набора изменений. Однако можно взять некоторые дополнительные изменения для cvsps для его поддержки и изменить исходный git -cvsimport на то, что использует обновленный cvsps (я пробовал это и, похоже, работает). С точки зрения преимуществ он поддерживает инкрементные обновления и имеет некоторую логику для правильного импорта слияний (но он ТРЕБУЕТ подходящего формата для сообщения фиксации).

parsecvs до сих пор дал мне лучшие результаты. К сожалению, код, доступный в Интернете, не скомпилирован с последним git. Изменение не является тривиальным.

EDIT: похоже, ESR взял на себя как cvsps и parsecvs, поэтому есть надежда на перенос CVS → GIT. НО он уже упоминал в каком-то списке рассылки, что он может объявить некоторые из инструментов, которые он принял недавно официально умершим.

Ответ 9

Вы можете использовать git cvsimport. Он требует установки cvsps, но вам нужно установить 2.x, поскольку 3.x несовместимо.

Затем импортируйте репозиторий CVS на пустой git. Использование примера:

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

В OSX вы устанавливаете cvsps-2.1 следующим образом (с brew):

brew tap homebrew/versions
brew install cvsps2
brew link  cvsps2

Вы также можете использовать инструмент 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.

Ответ 10

Я прочитал ответ Вануа и комментарии к нему. К сожалению, mhagger не опубликовал, как это сделать с помощью cvs2git. Здесь все очень хорошо написано: http://www.mcs.anl.gov/~jacob/cvs2svn/cvs2git.html

Я использовал cvs2git вместо git-cvsimport, потому что документация git-cvsimport предлагает использовать его вместо этого, чтобы избежать проблем git-cvsimport: https://www.kernel.org/pub/software/scm/git/docs/git-cvsimport.html#issues

Это следует за сущностью, которая сработала для меня, чтобы создать репозиторий git из репозитория CVS sourceforge на Debian Sid:

$ apt-get install cvs2svn cvs
$ mkdir project.cvs
$ rsync -av rsync://${PROJECT}.cvs.sourceforge.net/cvsroot/${PROJECT}/ project.cvs
$ cvs2git --blobfile=git-blob.dat --dumpfile=git-dump.dat --username=cvs2git project.cvs
$ mkdir project.git
$ cd project.git
$ git init
$ cat ../git-blob.dat ../git-dump.dat | git fast-import

Шаг rsync необходим, потому что cvs2git нужен доступ ко всей истории. Простой контроль недостаточно.

Ответ 11

Я нашел cvs-fast-export, проделал отличную работу. Мне пришлось загрузить и скомпилировать его самостоятельно, но у меня не было никаких существенных проблем.