Skip to content

Latest commit

 

History

History
120 lines (103 loc) · 6.52 KB

File metadata and controls

120 lines (103 loc) · 6.52 KB

Mercurial

Оскільки Mercurial та Git використовують дуже схожі моделі для збереження версій, а Git трохи гнучкіший, перетворення репозиторія з Mercurial на Git доволі прямолінійно, якщо використати інструмент під назвою "hg-fast-export", який вам треба скопіювати:

$ git clone http://repo.or.cz/r/fast-export.git /tmp/fast-export

Першим кроком перетворення є отримання повного клону сховища Mercurial, яке ви бажаєте перетворити:

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

Наступним кроком є створення файлу відображення авторів. Mercurial трохи більш поблажливий, ніж Git, щодо того, що він дозволить записати в поле автора набору змін (changeset), отже, настав час прибратися в домі. Ось однорядкова команда оболонки bash для генерації цього файлу:

$ cd /tmp/hg-repo
$ hg log | grep user: | sort | uniq | sed 's/user: *//' > ../authors

Це займе декілька секунд, у залежності від того, наскільки довгу історію має ваш проект, а потім файл /tmp/authors виглядатиме приблизно так:

bob
bob@localhost
bob <[email protected]>
bob jones <bob <AT> company <DOT> com>
Bob Jones <[email protected]>
Joe Smith <[email protected]>

У цьому прикладі, одна людина (Боб) створювала набори змін під чотирма різними іменами, одне з яких дійсно виглядає правильним — те, яке буде цілком відповідним для коміту Git. Hg-fast-export дозволяє нам виправити це, якщо додати ={нове імʼя та поштова адреса} наприкінці кожного рядка, який ми бажаємо змінити, та якщо видалити будь-які імена користувачів, які ми бажаємо облишити. Якщо всі імена користувачів виглядають правильно, то нам взагалі не потрібен цей файл. У цьому прикладі, ми бажаємо, щоб наш файл виглядав так:

bob=Bob Jones <[email protected]>
bob@localhost=Bob Jones <[email protected]>
bob <[email protected]>=Bob Jones <[email protected]>
bob jones <bob <AT> company <DOT> com>=Bob Jones <[email protected]>

Наступним кроком є створення нашого нового сховища Git, та виконання скрипту експорту:

$ 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, де знайти сховище Mercurial, яке ми бажаємо перетворити, а опція -A повідомляє йому, де знайти файл відображення авторів. Скрипт зчитує набори змін Mercurial та перетворює їх на скрипт для функції Git "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

Це фактично все, що потрібно. Усі теґи Mercurial були перетворені на теґи Git, гілки та закладки Mercurial були перетворені на гілки Git. Тепер ви готові для надсилання сховища до нової серверної домівки:

$ git remote add origin git@my-git-server:myrepository.git
$ git push origin --all