Migrace do Gitu: 1. díl - CVS

V třídílném seriálu se podíváme na zkušenosti s migrováním projektů do verzovacího systému Git. Postupně popíšeme převod z repositářů CVS, SVN a Mercurial.

V rámci našich projektů používáme hned čtyři verzovací systémy (CVS, SVN, Mercurial, Git). To přináší řadu problémů jak se správou repositářů, tak se znalostí všech systémů ze strany vývojářů.

Migrace se prioritně týká repositářů starších systémů CVS a SVN, jejichž využívání se nám v dnešní době zdá, s ohledem k novějších alternativám, naprosto nedostačující.

V posledních dvou letech jsme pro nové projekty volili buď Git nebo Mercurial. Nyní jsme rozhodli pro výběr pouze jednoho řešení. Po častých diskusích jsme se přiklonili spíše ke Gitu.

Posledním impulsem bylo zavedení GitLabu, jako pohodlnějšího prostředku pro správu Git repositářů.

Nové projekty tak budeme vyvíjet převážně v Gitu. U současných projektů v Mercurialu na migraci nějak zásadně netlačíme, přesto jsme způsob převodu také prozkoumali.

Pro všechny tři systémy jsme tedy hledali vhodná řešení, kterých lze na webu najít hned několik. My jsme zvolili následující nástroje:

  • CVS - cvs2git
  • SVN - svn2git
  • Mercurial - hg-fast-export

V dnešním díle se podíváme na migraci z CVS:

Prerekvizity

  • Konverzní nástoj cvs2git (upravená verze cvs2svn)
  • Python
  • GIT
  • CVS
  • Přímý přístup na CVS ze stroje kde se bude převádět (moutnutý jako adresář)

Převod

Nastavení

  • Z adresáře nástroje cvs2git zkopírovat cvs2git-example.options → cvs2git-PROJEKT.options
  • Změnit ctx.tmpdir = r'cvs2git-tmp' ⇒ ctx.tmpdir = r'tmp-ADRESAR' (existující adresář kde se bude pracovat)
  • Změnit u ctx.revision_collector = GitRevisionCollector(… hodnotu 'cvs2git-tmp/git-blob.dat' ⇒ 'tmp-ADRESAR/git-blob.dat'
  • Vyřešit kódování - všechny CVSTextDecoder upravit (případně nastavit jen utf8 pokud je již tak v CVS):
    CVSTextDecoder(
        [
            'cp1250',
            'utf8',
            'ascii',
            ],
        #fallback_encoding='ascii'
        )
  • Změnit author_transforms={… na seznam autorů co jsou v CVS…
    Pro získání všech autorů v historii stačí v aktuálním CVS projekt adresáři (lokální CHECKOUT) zavolat:
    $ cvs log 2> /dev/null | egrep -o "author[^;]+;" | sort -u

    Výsledek bude něco takového:
    author: novak;
    author: svoboda;
    author: novotny;

    A podle toho vytvořit seznam do nastavení:
    author_transforms={
        'novak' : ('Jan Novak', 'jan.novak@etnetera.cz'),
        'svoboda' : ('Jan Svoboda', 'jan.svoboda@etnetera.cz'),
        'novotny' : ('Jan Novotny', 'jan.novotny@etnetera.cz'),
    
        # This one will be used for commits for which CVS doesn't record
        # the original author, as explained above.
        'cvs2git' : 'cvs2git <admin@example.com>',
        }
  • Změnit run_options.set_project(r'test-data/main-cvsrepos', ⇒ run_options.set_project(r'/mnt/REMOTE/cvs.etn/srv-cvs/repository-cvs/PROJEKT', (cesta k CVS projektu na Mountnutém adresáři)
  • Pro konverzi LF na CRLF (Linux ⇒ Windows entry) je dále potřeba nastavit:
  • DefaultEOLStyleSetter(None) ⇒ DefaultEOLStyleSetter('CRLF')
  • Přidat: from cvs2svn_lib.svn_run_options import SVNEOLFixPropertySetter (mezi from importy)
  • Přidat: SVNEOLFixPropertySetter(), (na konec do ctx.file_property_setters.extend([ …)

Spuštění

Provede se spuštěním python scriptu s naším nastavením:

$ python ./cvs2git --options=cvs2git-PROJEKT.options

  • Po dokončení by měly existovat soubory tmp-ADRESAR/git-dump.dat a tmp-ADRESAR/git-blob.dat
  • Poté založit složku pro projekt, inicializovat git a naimportovat tam výsledek převodu:
    $ mkdir PROJEKT.git
    $ cd PROJEKT.git
    $ git init --bare
    $ git fast-import --export-marks=../tmp-ADRESAR/git-marks.dat < ../tmp-ADRESAR/git-blob.dat 
    $ git fast-import --import-marks=../tmp-ADRESAR/git-marks.dat < ../tmp-ADRESAR/git-dump.dat

    Tím by měl být git adresář připravený. Můžete pokračovat případně dalšími body z dokumentace cvs2git - (minimálně udělejte kontrolu historie a větví)

Umístění do GIT serveru

  • Náš výtvor navázat na projekt (např. na GitHubu) a PUSHnout
    $ git remote add origin git@github.com:UZIVATEL/PROJEKT.git
    
    $ git push -u origin master
    
    #případně push dalších větví
    
    #pokud chcete přenést i tagy (a nějaké po převodu jsou)
    $ git push origin --tags

Začištění

Po převodu je dobré provést začišťovací úkon již na naklonované lokální kopii.
Soubory .cvsignore přejmenovat na .gitignore a minimálně dát na začátky řádků lomítko / (nebo udělat sjednocení a pročištění - dle potřeby)

Migrace do Gitu - seriál

Zdroje

Dokumentace cvs2git

Článek obsahuje 2 komentáře

  • MarMax

    1
    tak to jsem zvědavej na SVN -> GIT, já si s tím užil poslední dva měsíce... :)
  • Lukáš Voborský

    2
    Článek o SVN -> GIT máme v plánu vydat v nejbližších dnech.