Ker imate Mercurial in Git precej podobna modela za predstavitev verzij in ker je Git nekoliko bolj prilagodljiv, je pretvorba repozitorija iz Mercurial na Git precej enostavna z uporabo orodja imenovanega »hg-fast-export«, ki ga boste morali kopirati:
$ git clone https://github.com/frej/fast-export.gitPrvi korak pretvorbe je dobiti polni klon repozitorija Mercurial, ki ga želite pretvoriti:
$ hg clone <remote repo URL> /tmp/hg-repoNaslednji korak je ustvariti datoteko preslikave avtorja.
Mercurial je nekoliko bolj odpustljiv kot Git, zaradi česar bo dal polje avtorja za skupke sprememb, torej je to dober čas za čiščenje hiše.
Generiranje tega je ukaz ene vrstice v lupini bash:
$ cd /tmp/hg-repo
$ hg log | grep user: | sort | uniq | sed 's/user: *//' > ../authorsTo bo vzelo nekaj sekund, odvisno od tega kako dolga je zgodovina vašega projekta in potem bo datoteka /tmp/authors videti nekako takole:
bob
bob@localhost
bob <bob@company.com>
bob jones <bob <AT> company <DOT> com>
Bob Jones <bob@company.com>
Joe Smith <joe@company.com>V tem primeru je ista oseba (Bob) ustvarila skupek sprememb pod štirimi različnimi imeni, ena izmed njih je dejansko videti v redu in ena od njih bi bila popolnoma neveljavna za potrditev Git.
Hg-fast-export nam omogoča to popraviti s spremembo vsake vrstice v pravilo: "<input>"="<output>", kar preslika <input> v <output>.
Znotraj nizov <input> in <output> so podprta vsa ubežana zaporedja, ki jih razume Python kodiran string_escape.
Če datoteka s preslikavami avtorjev ne vsebuje prilegajočega se <input>, bo ta avtor posredovan naprej Gitu nespremenjen.
Če so vsa uporabniška imena videti v redu, te datoteke sploh ne bomo potrebovali.
V tem primeru želimo, da je naša datoteka videti takole:
"bob"="Bob Jones <bob@company.com>"
"bob@localhost"="Bob Jones <bob@company.com>"
"bob <bob@company.com>"="Bob Jones <bob@company.com>"
"bob jones <bob <AT> company <DOT> com>"="Bob Jones <bob@company.com>"Enaka datoteka preslikave se lahko uporabi za preimenovanje vej in oznak, ko ime Mercuriala to ne dovoljuje z Gitom.
Naslednji korak je ustvariti naš novi repozitorij Git in pognati izvozni skript:
$ git init /tmp/converted
$ cd /tmp/converted
$ /tmp/fast-export/hg-fast-export.sh -r /tmp/hg-repo -A /tmp/authorsZastaviva -r pove hg-fast-export, kje najti repozitorij Mercurial, ki ga želimo pretvoriti, zastavica -A pa mu pove, kje najti datoteko preslikav avtorjev (datoteke preslikav vej in oznak so določene z zastavicama -B in -T flags).
Skript prevede skupke sprememb Mercuriala in jih pretvori v skript za Gitovo lastnost »fast-import« (o kateri bomo govorili v podrobnosti nekoliko kasneje).
To vzame nekaj časa (čeprav je veliko hitreje, kot bi bilo preko omrežja) in izpis je precej opisen:
$ /tmp/fast-export/hg-fast-export.sh -r /tmp/hg-repo -A /tmp/authors
Loaded 4 authors
master: Exporting full revision 1/22208 with 13/0/0 added/changed/removed files
master: Exporting simple delta revision 2/22208 with 1/1/0 added/changed/removed files
master: Exporting simple delta revision 3/22208 with 0/1/0 added/changed/removed files
[…]
master: Exporting simple delta revision 22206/22208 with 0/4/0 added/changed/removed files
master: Exporting simple delta revision 22207/22208 with 0/2/0 added/changed/removed files
master: Exporting thorough delta revision 22208/22208 with 3/213/0 added/changed/removed files
Exporting tag [0.4c] at [hg r9] [git :10]
Exporting tag [0.4d] at [hg r16] [git :17]
[…]
Exporting tag [3.1-rc] at [hg r21926] [git :21927]
Exporting tag [3.1] at [hg r21973] [git :21974]
Issued 22315 commands
git-fast-import statistics:
---------------------------------------------------------------------
Alloc'd objects: 120000
Total objects: 115032 ( 208171 duplicates )
blobs : 40504 ( 205320 duplicates 26117 deltas of 39602 attempts)
trees : 52320 ( 2851 duplicates 47467 deltas of 47599 attempts)
commits: 22208 ( 0 duplicates 0 deltas of 0 attempts)
tags : 0 ( 0 duplicates 0 deltas of 0 attempts)
Total branches: 109 ( 2 loads )
marks: 1048576 ( 22208 unique )
atoms: 1952
Memory total: 7860 KiB
pools: 2235 KiB
objects: 5625 KiB
---------------------------------------------------------------------
pack_report: getpagesize() = 4096
pack_report: core.packedGitWindowSize = 1073741824
pack_report: core.packedGitLimit = 8589934592
pack_report: pack_used_ctr = 90430
pack_report: pack_mmap_calls = 46771
pack_report: pack_open_windows = 1 / 1
pack_report: pack_mapped = 340852700 / 340852700
---------------------------------------------------------------------
$ git shortlog -sn
369 Bob Jones
365 Joe SmithTo je večinoma vse, kar je. Vse oznake Mercuriala so bile pretvorjene v oznake Git in veje z zaznamki Mercurial so bili pretvorjeni v veje Git. Sedaj ste pripravljeni potisniti repozitorij na njegov novi strežniški dom:
$ git remote add origin git@my-git-server:myrepository.git
$ git push origin --all