воскресенье, 25 октября 2020 г.

Миграция etckeeper с mercurial на git

В начале 2012 года я начал использовать etckeeper для отслеживания изменения в /etc. Тогда я использовал Mercurial в качестве системы контроля версий и было очевидным использовать его в качестве бэкенда хранения для etckeeper.

Двумя годами позже я сменил место работы и целиком переключился на Git. Все новые инсталляции уже использовали Git для etckeeper, но домашний сервер и ноутбук все еще оставались на Mercurial. Где-то в районе выхода Debian Jessie ноутбук перешел на Git при миграции с i386 на amd64. А сервер оставался на Mercurial до сегодняшнего дня, но несколько попыток починить такую ошибку привели к миграции:

/etc/cron.daily/etckeeper:
abort: path contains illegal component: .hg/undo.dirstate
abort: path contains illegal component: .hg/undo.backup.dirstate
abort: path contains illegal component: .hg/undo.dirstate
abort: path contains illegal component: .hg/undo.backup.dirstate

Когда-то я уже описывал процесс миграции с Mercurial на Git с использованием расширения hg-git, но в этот раз решил попробовать сделать по инструкции с git-scm.com

В итоге получилось так:

$ mkdir ~/tmp/etckeeper
$ cd ~/tmp/etckeeper

$ sudo hg clone /etc mercurial
updating to branch default                                                                                                                          
2543 files updated, 0 files merged, 0 files removed, 0 files unresolved

$ cd mercurial/

$ hg log | grep user: | sort | uniq | sed 's/user: *//' > ../authors
not trusting file /home/andrey/tmp/etckeeper/mercurial/.hg/hgrc from untrusted user root, group root
not trusting file /home/andrey/tmp/etckeeper/mercurial/.hg/hgrc from untrusted user root, group root

$ sed -i -e 's#^\(.\+\)$#"\1" = "Andrey Tataranovich "#' ../authors

$ cat ../authors 
"andrey@server.home.tataranovich.com" = "Andrey Tataranovich "
"Andrey Tataranovich " = "Andrey Tataranovich "
"root@server.home.tataranovich.com" = "Andrey Tataranovich "
"@server.home.tataranovich.com" = "Andrey Tataranovich "

$ cd ../

$ git init converted
Initialized empty Git repository in /home/andrey/tmp/etckeeper/converted/.git/

$ git clone https://github.com/frej/fast-export.git
Cloning into 'fast-export'...
remote: Enumerating objects: 13, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 1666 (delta 3), reused 7 (delta 2), pack-reused 1653
Receiving objects: 100% (1666/1666), 484.84 KiB | 1.31 MiB/s, done.
Resolving deltas: 100% (970/970), done.

$ cd converted/

$ ../fast-export/hg-fast-export.sh -r ../mercurial/ -A ../authors 
Loaded 4 authors
master: Exporting full revision 1/997 with 1179/0/0 added/changed/removed files
Exported 1000/1179 files
Exported 1179/1179 files
master: Exporting simple delta revision 2/997 with 0/2/0 added/changed/removed files
master: Exporting simple delta revision 3/997 with 1/0/0 added/changed/removed files

[skipped]

master: Exporting simple delta revision 994/997 with 1/9/0 added/changed/removed files
master: Exporting simple delta revision 995/997 with 13/3/0 added/changed/removed files
master: Exporting simple delta revision 996/997 with 1/1/0 added/changed/removed files
master: Exporting simple delta revision 997/997 with 0/1/0 added/changed/removed files
Issued 997 commands
/usr/lib/git-core/git-fast-import statistics:
---------------------------------------------------------------------
Alloc'd objects:      15000
Total objects:        10982 (      2869 duplicates                  )
      blobs  :         6319 (      2521 duplicates       2249 deltas of       6061 attempts)
      trees  :         3666 (       348 duplicates       3021 deltas of       3268 attempts)
      commits:          997 (         0 duplicates          0 deltas of          0 attempts)
      tags   :            0 (         0 duplicates          0 deltas of          0 attempts)
Total branches:           1 (         1 loads     )
      marks:           1024 (       997 unique    )
      atoms:           3777
Memory total:          3001 KiB
       pools:          2298 KiB
     objects:           703 KiB
---------------------------------------------------------------------
pack_report: getpagesize()            =       4096
pack_report: core.packedGitWindowSize = 1073741824
pack_report: core.packedGitLimit      = 35184372088832
pack_report: pack_used_ctr            =          2
pack_report: pack_mmap_calls          =          1
pack_report: pack_open_windows        =          1 /          1
pack_report: pack_mapped              =   10480378 /   10480378
---------------------------------------------------------------------

$ git shortlog -sn
   997  Andrey Tataranovich

$ sudo mv .git /etc
$ sudo chown -R root:root /etc/.git
$ sudo chmod -R g-rwx,o-rwx /etc/.git
$ sudo mv /etc/.hgignore /etc/.gitignore
$ sudo vim /etc/etckeeper/etckeeper.conf # comment VCS="hg" and uncomment VCS="git"
$ sudo tar -cpzf /root/etc-20201025.tar.gz /etc # just in case :)
$ sudo rm -fr /etc/.hg/
$ sudo etckeeper init
$ sudo etckeeper commit "Migrate etckeeper from mercurial to git"
$ rm -fr ~/tmp/etckeeper

Комментариев нет:

Отправить комментарий