Script de migració de Subversion a git

Hi ha moltíssimes maneres de passar un repositori Subversion a git.

Ni molt menys és que sigui una tasca complexa, tot depèn de les bones pràctiques que s’hagin dut a terme en el Subversion.

A guifi.net hem decidit1 canviar del monolític Subversion de lafarga.cat a git. De moment ho enviarem a gitorious.org2, però això és el de menys. Al moment en que canvies a git, pots allotjar el codi allà on vulguis i canviar-ho els dies senars dels mesos parells si vols :)

Com que a lafarga.cat només teníem un sol repositori per el codi hi havia múltiples, fins a 15!, repositoris dins del mateix repositori i barrejats en diverses carpetes i demés.

Total, per sort l’historial en aquest cas no era crucial i amb un script que he creat ja s’està pujant el codi a gitorious.org :)

NOTA: encara no s’ha decidit una data oficial per abandonar lafarga.cat i abraçar de totes totes el git, serà aviat, esperem.

Els que tingueu ganes de jugar amb el git3 ja no teniu excusa que no hi ha codi real.

  1. De fet jo ho vaig decidir i ningú s’hi ha oposat de moment []
  2. En concret al projecte guifi de gitorious.org []
  3. Les diapositives que vaig utilitzar l’últim cop que en vaig parlar []

migrar de subversion a git a-la-GNOME

Avui al final m’he decidit a fer la migració d’algunes coses que tenim encara a la feina que estan amb subversion i passar-les a git.

Ja feia uns dies havia trobat una petita guia per fer la migració1, però avui quan m’hi he posat m’he trobat que no em funcionava tal com jo volia.

No és que el repositori de git no el deixés funcionant correctament, sinó que com que tot i que sigui un scm descentralitzat tenim un servidor on hi ha el codi, etc etc no deixava el repositori en el mateix format.

Després de donar-hi unes quantes voltes m’he adonat que el que estava intentant fer era migrar de subversion a git amb els mateixos propòsits i casos d’ús que el GNOME, així que després de buscar una mica he arribat a la guia de migració del GNOME que m’ha portat a una pàgina personal en el wiki del GNOME on s’explica com fer el canvi de format dels repositoris.

I ara sí, ja puc clonar els repositoris del servidor amb total llibertat :)

Pels curiosos, aquest és l’script que he utilitzat (un mix de les dues solucions apuntades abans):

mkdir NOM-REPOSITORI.git
cd NOM-REPOSITORI.git
git –bare init
git –bare svn init https://servidor.codi.org/subversion/REPOSITORI –no-metadata
git config svn.authorsfile /git/users.txt*
git –bare svn fetch

* S’ha de crear un fitxer amb una línia per autor a l’estil: nom.usuari = Nom Real <correu@electronic.org>

P.D. Tot buscant informació sobre la migració i tot plegat he arribat a una entrada d’un bloc on hi havia la frase “You don’t branch because you don’t use git”2 i la veritat és que té molta raó la frase, el canvi de subversion a git, entre moltes d’altres millores és que hi ha gestió de branques i no una simple recreació d’arbres de directoris sense cap mena de control per part del sistema de control de versions, a veure com em va!

  1. De fet ja ho havia comentat per identi.ca :D []
  2. No crees branques perquè no utilitzes git []

Crear un dipòsit de Subversion amb accés per http i per ssh

A la universitat hem de fer una màquina de Turing (català) i com que l’hem de fer en grup crec que la millor manera és posar un servidor de Subversion (hi estic més acostumat, amb git només he fet “git clone $url“).

Així que “dit i fet“:

  • Com que el servidor és un Gentoo aquesta guia m’ha anat que ni pintat, et descriu els passos per tal de configurar un servidor Subversion a la màquina i com fer per permetre que es pugui accedir en mode lectura per web i els usuaris que vulguis en mode lectura i escriptura.
  • Com que a més vull donar accés per SSH (ja que hi estic acostumat del GNOME) només m’ha fet falta seguir aquesta altra guia que ho deixa força clar :)
  • Però aquí no acaba tot, com que la xarxa que tinc muntada al pis de Girona és una mica peculiar, el port de l’SSH no és el predeterminat (22), de manera que aquesta altra guia m’ha resolt els dubtes.

Ara sí, llestos :)

comparar dues revisions d’un fitxer amb svn

Quan encara no heu confirmat uns canvis en un fitxer que està versionat amb svn podeu utilitzar l’ordre svn status per saber quins fitxers estan modificats i un svn diff $nom_fitxer per veure el canvis respecte l’última vegada que vau actualitzar el dipòsit amb un svn up (o un svn co $url).

Ara bé, si acabeu de fer la confirmació (commit) i voleu agafar-ne el pedaç per aplicar-lo a una altra branca o enviar-lo a algú com ho podeu fer?

La resposta és senzilla un cop la saps, com de costum :)

Primer feu un svn log $nom_fitxer i aquest us mostrarà les revisions en que heu modificat el fitxer de manera que si les revisions són la 35 i la 44 només heu de fer un:

svn diff $url_fins_al_fitxer@35 $url_fins_al_fitxer@44

L’URL del fitxer el podeu trobar fàcilment si feu un svn info i afegiu el tros de camí (path) fins al fitxer.

Si fóssin dos fitxers diferents, que pel motiu que sigui els heu bifurcat en el propi dipòsit (per dir alguna cosa: script_v1.sh i script_v2.sh) en principi no caldria posar tot l’url, sinó que amb els camis en local i @REVISIÓ ja n’hi hauria prou.

Uff, fins a 6 ordres hem necessitat: svn {stats, diff, up, co, log, info}

recuperar fitxers suprimits

logotip del SubversionPer recuperar fitxers suprimits amb el Subversion:

svn –verbose log (per a mirar en el registre quan es va suprimir i per tant saber la revisió anterior a la que es va suprimir per poder-lo recuperar)

svn copy svn+ssh://gforcada@svn.gnome.org/svn/damned-lies/trunk/po/POTFILES.in@1091 POTFILES.in

El URL del fitxer@revisió  i el nom del fitxer destí (per si el volem recuperar amb un nom diferent).

Resulta que fa un temps es feia servir una altra sintaxi que ara no serveix :S

Sort que hi ha el llibre :)

Hi ha algun llibre semblant per el git?

crear un repositori al subversion

En el servidor executeu:

repositori=NOM_PROJECTE

svnadmin create /var/svn/repos/$repositori
chown -R apache:svnusers /var/svn/repos/$repositori
chown -R g-w /var/svn/repos/$repositori
chown -R g+rw /var/svn/repos/$repositori/db
chown -R g+rw /var/svn/repos/$repositori/locks

En el client (per ssh) [1]:

svn import -m"comentari"  FITXERS_A_IMPORTAR svn+ssh://USUARI@MÀQUINA/var/svn/repos/$repositori

En el client (per http) [2]:

svn import -m"comentari" FITXERS_A_IMPORTAR http://MÀQUINA/svn/$repositori

[1] [2] Evidentment, s’ha de configurar tant l’ssh com l’apache perquè ho permetin :)

com fer que l’apache mostri els repositoris svn del servidor

logotip del SubversionTinc un parell de repositoris subversion al servidor vell i com que vull donar-hi accés a d’altres persones m’he decidit a fer el que diu el títol: permetre que es pugui accedir des de web i de forma anònima als repositoris.

Com que és en el servidor hi ha Gentoo hi ha una guia que està molt bé: Gentoo-Subversion.

Fins al punt 11 m’ha anat perfecte, però aquí ha punxat :(

Per sort he trobat unes quantes guies que expliquen com configurar l’Apache, i en concret la guia del llibre del Subversion està molt bé.[1]

Ja està tot configurat :)

De moment només n’he configurat l’accés a un dels dos repositoris (l’altre quan tingui temps :)

Cosa que em recorda que hauria de mirar de fer servir subdominis per al servidor vell també, que ara mateix es un cacau si es vol accedir-hi :(

[1] Quant buscava un paràmetre en concret (AuthzSVNAccessFile) el primer resultat que m’ha sortit ha sigut un article d’en Marc a Comesfa.org :)

suprimir els fitxers que no són d’un dipòsit

logotip del SubversionEs veu que m’ha agafat la dèria de fer-me scripts per a tot :)

El d’avui és per el típic cas en que estem treballant amb un dipòsit i per poder fer comparacions i tot plegat ens queden la tira de fitxers temporals repartits per tot arreu i que un cop acabada la feina i confirmada (commit en anglès) només fan nosa, així que anem a suprimir-los:

svn status | grep ? | cut -d” ” -f7 | xargs rm

amb svn status ens dirà quins fitxers hi ha diferents dels que estan actualment al dipòsit SVN, amb el grep agafem els que es desconeix (normalment seran aquests els que volem suprimir), seguidament agafem només el nom del fitxer amb el cut i per acabar amb l’xargs i un simple rm els eliminem tots :D

baixar el codi amb 3 paraules

logotip del Subversioncansat d’haver d’escriure cada dia el svn co svn+ssh://gforcada@svn.gnome.org/svn/$mòdul/$branca $directori avui per fi m’he fet un script que només li has de dir el mòdul, la branca i opcionalment el directori (sinó agafa el mateix valor que el mòdul) i llestos ja t’ho baixa :)

exemple de crida:

svnco.sh NetworkManager trunk nm

a més ja hi he posat l’usuari i servidor com a variables al principi de tot perquè si algú el vol utilitzar li sigui ben fàcil canviar-ho :)

per a poder-lo cridar d’aquesta manera s’ha d’editar el fitxer ~/.bashrc i dir-li que afegeixi en el PATH el directori on deixeu l’script (normalment si sou usuari normal i no teniu permís de sistema seria a ~/.bin), de manera que si editeu el ~/.bashrc hi hauria d’haver una línia a l’estil:

export PATH=$PATH:~/.bin

i llestos, a baixar codi que falta poc pel GNOME 2.22!