Пошто Меркуријал и Гит имају прилично сличне моделе за представљање верзија, а како је програм Гит мало флексибилнији, конвертовање репозиторијума из Меркуријал у Гит је прилично лако, употребом алата под називом hg-fast-export, који прво треба да преузмете:
$ git clone http://repo.or.cz/r/fast-export.git /tmp/fast-exportПрви корак конверзије је да преузмете потпуни клон Меркуријал репозиторијума који желите да конвертујете:
$ hg clone <URL адреса удаљеног репозиторијума> /tmp/hg-repoНаредни корак је креирање фајла за мапирање аутора.
Меркуријал није толико стриктан као Гит у вези тога шта ће ставити у поље аутора скупа измена, тако да је ово добар тренутак да мало поспремите кућу.
Генерисање овог фајла је једнолинијска команда у bash љуски:
$ cd /tmp/hg-repo
$ hg log | grep user: | sort | uniq | sed 's/user: *//' > ../authorsОво ће потрајати неколико секунди, зависно од величине историје пројекта, па ће након тога фајл /tmp/authors изгледати отприлике овако:
bob
bob@localhost
bob <bob@company.com>
bob jones <bob <AT> company <DOT> com>
Bob Jones <bob@company.com>
Joe Smith <joe@company.com>У овом примеру, иста особа (Bob) је креирала скупове измена користећи четири различита имена, од којих једно изгледа коректно, а једно би било потпуне неисправно за Гит комит.
Hg-fast-export вам омогућава да ово исправите тако што сваку линију претворите у правило: "<улаз>"="<излаз>", које мапира <улаз> у <излаз>.
Унутар стрингова <улаз> и <излаз>, подржавају се сви означени низови које препознаје Пајтон string_escape кодирање.
Ако фајл мапирања аутора не садржи одговарајући <улаз>, онда се тај аутор шаље програму Гит неизмењен.
Ако сва корисничка имена изгледају како треба, нема потребе да се овај фајл исправља.
У овом примеру, желимо да наш фајл изгледа на следећи начин:
"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>"Наредни корак је да креирамо наш нови Гит репозиторијум и да извршимо скрипту за извоз:
$ git init /tmp/converted
$ cd /tmp/converted
$ /tmp/fast-export/hg-fast-export.sh -r /tmp/hg-repo -A /tmp/authorsЗаставица -r говори hg-fast-export где да пронађе Меркуријал репозиторијум који желимо да конвертујемо, а заставица -A говори где да пронађе фајл са мапирањима аутора.
Скрипта парсира Меркуријал скупове измена и конвертује их у скрипту за „fast-import” могућност програма Гит (коју ћемо детаљно приказати мало касније).
Ово ће потрајати (мада је много брже него што би било преко мреже), а излаз је прилично детаљан:
$ /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 SmithИ то је скоро све у вези конверзије. Све Меркуријал ознаке су конвертоване у Гит ознаке, а Меркуријал гране и маркери су конвертовани у Гит гране. Сада сте спремни да гурнете репозиторијум узводно на његово ново место на серверу:
$ git remote add origin git@my-git-server:myrepository.git
$ git push origin --all