CVS в Mercurial преобразование получает теги неправильно - PullRequest
2 голосов
/ 02 апреля 2010

Я перепробовал все рекомендуемые методы конвертации

В основном им удается правильно установить последнюю версию файлов, но каждый из них уничтожает мою историю. Многие (большинство?) Теги из моего проекта cvs содержат по крайней мере один файл по ошибке при запуске «hg up $ tag»

Мое резюме не так уж сложно. Почему ничего нельзя конвертировать? Я хотел бы сбросить cvs и преобразовать в mercurial, но не без истории.

Чтобы вспомнить мое разочарование:

Я пытался HG конвертировать (пробовал --branchsort, - timesort, fuzz = 0)

Я попытался cvs2svn и затем hg convert.

портной не работает с последними версиями Mercurial

fromcvs исчезли с лица земли

hg-cvs-import оставлен на 4 года и не работает с последними версиями hg

Я пытался использовать две самые последние версии Mercurial (1.5 и 1.5.1).

Ответы [ 4 ]

2 голосов
/ 25 октября 2010

fromcvs вернулся. Я тестирую его на очень большом репо, и это очень быстро и обрабатывает пошаговое преобразование.

2 голосов
/ 03 апреля 2010

Марк, это неоптимальное решение, но когда компания, с которой я работал, выполнила миграцию CVS-> Mercurial, мы решили, что все, о чем мы заботились, - это снимки тегов, поэтому мы создали небольшой цикл for:

for thetag in $(cat LIST_OF_RELEASE_TAGS) ; do
   cvs update -r $thetag
   hg commit --addremove -m "snapshot $thetag" -u "import"
   hg tag $thetag
done

Это предполагало линейную цепочку тегов, но мы работали только в основной / производственной ветке. Более сложный цикл будет вызывать «hg update» перед каждым коммитом, чтобы получить происхождение, отражающее ветвление CVS.

Это определенно не «полная история», но этого было достаточно, чтобы мы чувствовали себя хорошо, продолжая в Mercurial, не теряя нашей способности сказать «Что, черт возьми, было в версии 1.1.11 ?!» и мы всегда можем вернуться к cvs, если нужна cvs blame история уровней.

1 голос
/ 03 апреля 2010

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

ПРЕДУПРЕЖДЕНИЕ. Предполагается, что вы сделали копию CVSROOT и работаете над этим. Не гадите с оригиналом.

Это решение bash, которое работает для меня на моей Linux-коробке. Это, вероятно, сожжет ваш дом и пригласит вашего хулигана начальной школы переехать к вам по соседству. Вы были предупреждены.

Он использует cvsps для определения тегов проблемы, rcs для их удаления, а затем удаляет теги из CVSROOT / history. После удаления кэша cvsps преобразование hg работает как положено.

CVSROOT=/path/to/your/copy
MODULE=cvsmodule
rm -rf ~/.cvsps ~/.hg.cvsps # this cache is EVIL!

BADTAGS="`cvsps -q -x $MODULE |grep Tag: |grep -e FUNKY -e INVALID | awk '{print $2}' `"
while [ ! -z "$BADTAGS" ];do
    cd $CVSROOT/$MODULE
    for badtag in $BADTAGS;do
      echo removing tag $badtag
      grep -lr $badtag . | xargs --no-run-if-empty -l1 rcs -q -n$badtag
      grep -v "$badtag|$MODULE" < $CVSROOT/CVSROOT/history > $CVSROOT/CVSROOT/history_
      mv $CVSROOT/CVSROOT/history_  $CVSROOT/CVSROOT/history
    done
    BADTAGS="`cvsps -q -x $MODULE |grep Tag: |grep -e FUNKY -e INVALID | awk '{print $2}' `"
done
rm -rf ~/.cvsps ~/.hg.cvsps # this cache is EVIL!
mkdir ~/hgcvt
cd ~/hgcvt
cvs co $MODULE
hg convert $MODULE
0 голосов
/ 07 мая 2010

Теперь я понимаю, что есть некоторые фундаментальные несовместимости между тегами cvs и тегами hg.

В cvs версия файла имеет теги, связанные с разными версиями.

В hg версия является псевдонимом для набора изменений. Другими словами состояние рабочих файлов при некотором снимке во времени

Различие тонкое, но важное.

Возможно сделать помеченный выпуск в cvs версии, которая не представляет моментальный снимок во времени. Это невозможно в hg.

Конечно, можно применять патчи для получения реплик. Тем не менее, это создаст много новых голов в хранилище с возможно небольшой выгодой (при условии, что репозиторий cvs все еще хранится для потомков).

Боюсь, что идеальное преобразование из cvs в mercurial нецелесообразно. Решение Ry4an будет работать для тех, кто заботится только о воссоздании версий. Меня больше интересует история и эволюция исходных файлов.

Я написал следующий скрипт, чтобы просто конвертировать все теги cvs в $ CVSROOT до преобразования. например, тег «v321» становится «v321_prehg». Таким образом, разработчики узнают, что эти теги не авторизованы, и они должны вернуться к дереву cvs только для чтения.

#!/usr/bin/python
import os
import sys
import stat

def die(msg):
    sys.stderr.write(msg)
    sys.exit(1)

cvsroot =os.getenv("CVSROOT")
if cvsroot is None:
    die("CVSROOT not defined" )

print "CVSROOT=%s" % cvsroot

for rcsfile in os.popen("find %s -name '*,v'" % cvsroot).xreadlines():
    rcsfile = rcsfile.replace('\n','')
    print "rcsfile:%s" % rcsfile
    st=os.stat(rcsfile)
    if  st.st_mode & stat.S_IWUSR == 0:
        os.chmod(rcsfile,st.st_mode | stat.S_IWUSR)

    f = open(rcsfile,"r")
    inlines=f.readlines()
    f.close()

    outlines=[]
    insymbols=False
    symbolsDone=False
    for l in inlines:
        if insymbols and not symbolsDone:
            if l.find('\t') == 0:#tag line
                l= l.replace(":","_prehg:",1)
            else:
                symbolsDone=True
        else:
            if l == "symbols\n":
                insymbols=True
        outlines.append(l)

    f = open(rcsfile,"w")
    f.writelines( outlines )
    f.close()
...