Migrarea unui repo git cu tot cu branch-uri în alt mediu, pe alt server.

Image @ http://merrigrove.blogspot.com

A venit și acel moment din viață în care mi-am pus problema migrării unui repo git de pe un server pe altul cu păstrarea branch-urilor și a istoricului acțiunilor.
Și cum altfel decât între medii diferite, fără acces direct între ele.
Ar fi trebuit să fie simplu, dar s-a dovedit că e puțin mai mult de muncă, așa că adun aici (poate așa reușesc să repet mișcarea asta vreodată) lista pașilor de urmat.

Primul pas este să aduc pe local toate datele de pe repo, cu toate branch-urile:

alex@ubuntu:~$ git clone git@github.com:proiectulmeu/test.git

Apoi vine rândul fiecărui branch în parte și încă un pull ca să fie treaba sigură:

alex@ubuntu:~/test$ cd test
alex@ubuntu:~/test$ git checkout master
alex@ubuntu:~/test$ git pull -f
alex@ubuntu:~/test$ git checkout development
alex@ubuntu:~/test$ git pull -f
alex@ubuntu:~/test$ git checkout test
alex@ubuntu:~/test$ git pull -f

Fac apoi un director în care să adun bundle-ul proiectului git:

alex@ubuntu:~$ mkdir bundles

Având toate branch-urile local, am adaptat scriptul făcut de Pagan Maganti (https://github.com/pmaganti/git-bundler/blob/master/bundler.sh) pentru a face un fișier bundle cu toate branch-urile, versiunea mea ajungând să arate cam așa:

#!/bin/bash
cd /home/alex/test
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
git branch --track ${branch#remotes/origin/} $branch || git branch
done && git bundle create ../bundles/test.bundle --all && git bundle verify ../bundles/test.bundle"

În momentul ăsta sunt fericitul posesor al unui bundle care (teoretic) conține toate branch-urile de pe repo-ul care trebuie migrat.

Odată ajuns fișierul cu bundle-ul în noul său mediu, ar fi de restaurat în noua casă și pornită treaba mai departe.

Până aici treaba e destul de simplă, fiind plin internetul de instrucțiuni (exceptând manualul de git care e destul de cuprinzător), și probabil că pot fi numit un vașnic absolvent al școlii ajutătoare de git.

Pe mașina cea nouă bundle-ul terbuie “despachetat”.
După inițializarea unui git nou, desfac budle-ul și fac un merge pe HEAD folosindu-i id-ul. Apoi se fac remapările pentru branch-uri și se “curăță” cu un reset –hard.

alex@server:~$ mkdir test
alex@server:~$ cd test
alex@server:~/test$ git init
alex@server:~/test$ git bundle unbundle ../test.bundle
alex@server:~/test$ git merge d7fd1f4f
alex@server:~/test$ git fetch -u ../test.bundle 'refs/*:refs/*'
alex@server:~/test$ git reset --hard

“În acest mod simplu, pomul ajunge lângă fereastră. Aici, avem avantajul că odată cu pomul putem aprinde și perdeaua.”… asta era din altă scenetă, nu cu git, dar e cumva din același serial.
Acum ar trebui ca proiectul împreună cu toate branch-urile sale să fie restaurate local, calde și numai bune de a fi urcate pe serverul cel nou.

alex@server:~/test$ git remote add origin https://alex@serverulprivatcelnou/proiectulmeu/test.git
alex@server:~/test$ git push --mirror origin

Acum proiectul este restaurat complet în noul său mediu, cu tot istoricul commit-urilor, cu branch-uri și toate cele necesare continuării dezvoltării în noul mediu de lucru.

 

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.