blami tec

Alguns apunts de tecnologia

Archive for Juny 2012

Equips sincronitzats amb un pendrive i amb git

leave a comment »

Per la meva feina faig servir bàsicament dos ordinadors, el de casa i el de la feina.

En tots dos vull tenir la mateixa informació i, de fet, vull disposar en tot moment de tot l’històric de canvis per si haig de rescatar alguna versió anterior d’algun fitxer realitzada a qualsevol de les màquines. A banda, em cal no dependre de la disponibilitat de xarxa (dropbox i similars descartats). A més a més, alguns dels continguts amb que treballo no han d’arribar a algunes persones i per tant la versió gratuïta de GitHub i similars doblement descartada.

Fins ara me n’anava sortint passant la informació amb un pendrive, fent servir alguns scripts casolans que no acabaven de resoldre bé tots els casos: pex. quan esborrava un fitxer a casa, però l’havia modificat a la feina.

Finalment m’he decidit a donar el pas i ho he intentat muntar amb git [1].

El mecanisme final m’ha resultat raonablement fàcil: cal crear tres repositoris, un a cada màquina i l’altre al pen.

Com que vull poder accedir als fitxers també des del pen i de vegades ho haig de fer a diferents màquines que no sempre disposen de git, no em serveix crear un repo –bare, i mira que seria més còmode! En breu, com que el repositori del pen no és bare, no puc fer fàcilment git push des de les màquines contra el pen. En canvi, haig de fer git pull des de cada repositori. Si això no et diu res, simplement ignora-ho: has tingut sort de no trobar-t’ho.

Primer de tot, cal definir clarament els noms que donarem als repositoris remots.

Per exemple, considera els noms del següent esquema

Esquema de l’estructura del sistema

Un cop tenim clar com està, comencem la configuració

1. connecta el pen a la màquina de casa i, des d’un terminal, escriu:

$ cd PATH_CONTINGUTS_CASA
$ git init         # només si encara no és un repositori git
$ git remote add pen PATH_CONTINGUTS_PEN
$ git config remote.pen.mirror true

2. Ara anem pel pendrive

$ cd PATH_CONTINGUTS_PEN
$ git init         # només si encara no és un repositori git
$ git remote add casa PATH_CONTINGUTS_CASA
$ git config remote.casa.mirror true
$ git remote add feina PATH_CONTINGUTS_FEINA
$ git config remote.feina.mirror true

3. Quan puguis faràs quelcom semblant a la màquina de la feina

$ cd PATH_CONTINGUTS_FEINA
$ git init         # només si encara no és un repositori git
$ git remote add pen PATH_CONTINGUTS_PEN
$ git config remote.pen.mirror true

4. ja està!

Per sincronitzar des de casa, per exemple, pots fer

$ cd PATH_CONTINGUTS_CASA
$ git add -A .                  # o el que vulguis afegir
$ git commit -am "missatge"
$ git pull pen master

i el mateix pel pendrive

$ cd PATH_CONTINGUTS_PEN
$ git add -A .                  # o el que vulguis afegir
$ git commit -am "missatge"
$ git pull casa master

Amb això, hauries de trobar-te el mateix a la branca master dels dos repositoris. Si treus el pen, te l’emportes a la feina i fas el mateix (bé, des del pen has de fer $ git pull feina master en comptes de casa), ja tens els continguts de la feina sincronitzats amb els de casa.

Si un cop finalitzes a la feina, tornes a fer la sincronització amb el pen i t’ho emportes a casa, tindràs els darrers canvis a casa.

El problema sembla resolt, però… és una mica pal, oi?

M’he fet un script que m’ho automatitza:

#! /bin/bash
LOCAL="/cami/als/continguts/de/casa"   # cal canviar pel camí a la
PEN="/cami/als/continguts/del/pen"
#
LOCAL_NAME=casa                        # posarem feina a la feina
PEN_NAME=pen
#
commit () {
    # afegeix tots els possibles canvis al stage del repositori que es troba a $1
    # i fa el commit.
    if [ -d $1 ];
    then
        echo "··· Commit on $1"
        cd $1
        find . -type d | grep -v "\.\w" | sed "s/\(.*\)/\"\1\"/g" | xargs git add -A
        git commit -am "`date`"
    fi
}
#
if [ -d $LOCAL ];
then
    commit $LOCAL
    if [ -d $PEN ];
    then
        commit $PEN
        cd $LOCAL
        echo "··· Pulling from $PEN"
        git pull $PEN_NAME master
        cd $PEN
        echo "··· Pulling from $LOCAL"
        git pull $LOCAL_NAME master
    fi
fi

Si el vols fer servir, simplement copia el contingut anterior, crea un fitxer, enganxa-li el contingut, i guarda’l en algun lloc que recordis.

Per exemple, jo el tinc guardat a ~/bin/Skz.sh perquè em permet cridar-lo des de qualsevol directori.

Algunes consideracions a tenir en compte si vols fer-ho anar:

1. és possible que el primer cop que l’executis et surti un fatal error. Sembla que si no hi ha res als repositoris, el git es queixa. Penso que pots ignorar el missatge amb tranquil·litat si, quan tinguis continguts, deixa de mostrar el missatge.

2. afegeix TOTS els canvis a cada commit. Si vols filtrar, hauràs de modificar la funció commit() o bé configurar git perquè ignori el que vulguis. Per exemple, a mi m’emprenya que conservi els *~ que em genera el vim. Simplement he afegit *~ al fitxer ~/.gitignore_global com indiquen a aquest article.

3. la sortida pot ser una mica dura de llegir. Potser més endavant miri com processar-la de manera que el script em generi quelcom més “humà”. Si ho fas tu, i ho vols compartir, des de ja et dono les gràcies!


[1] Moltes gràcies Alejandro per la teva insistència i per aquella decisiva introducció al git!

Written by blami

20 Juny 2012 at 20:30

Arxivat a General