Skip to content

Latest commit

 

History

History
124 lines (106 loc) · 5.47 KB

File metadata and controls

124 lines (106 loc) · 5.47 KB

Mercurial

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.git

Prvi korak pretvorbe je dobiti polni klon repozitorija Mercurial, ki ga želite pretvoriti:

$ hg clone <remote repo URL> /tmp/hg-repo

Naslednji 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: *//' > ../authors

To 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/authors

Zastaviva -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 Smith

To 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