Теперь я понимаю, что есть некоторые фундаментальные несовместимости между тегами 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()