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

  • Postat în Personal
  • la 07-11-2018 16:53
  • 309 vizualizări

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 [email protected]: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.

Articole asemănătoare:

  • Bash-it - un framework cu ajutorul căruia îți poti… Bash-it este un pachet de scripturi și comenzi pentru versiuni ale Bash mai noi de 3.2, pachet făcut de comunitatea…
  • Cel mai mare cablu subacvatic stabilește un nou record Cablul subacvatic cu cea mai mare capacitate din lume, pe numele său MAREA este capabil să susțină viteze de transfer…
  • 10 ani! Fără să-mi dau seama au trecut 10 ani de când există alex.burlacu.org :) Ani în care acest "loc de joacă…
  • 2 roți Cum lista jucăriilor pe 2 roți s-a înmulțit, mă gândesc să am aici măcar o poză cu fiecare în parte…
  • Paginile individuale de pornire ale Google Sheets,… Acum 10 ani când am început să scriu aici, prima postare a fost despre Google. Coincidență sau nu, azi am…