Synchroniser plusieurs répertoires sur GIT

Dans ce tutoriel, Le BlogDuWebdesign vous propose de découvrir la synchronisation de répertoires avec GIT. Vous apprendrez également la gestion de ces répertoires. 

Introduction à la synchronisation de répertoires

Il y’a quelques semaines nous avions vu comment installer GIT et comment manager son projet GIT.

C’est bien de savoir gérer ses projets avec GIT, mais se limiter à cela serait triste. En effet, une des fonctionnalités centrale de GIT est de pouvoir travailler à plusieurs. 

La semaine dernière, nous avions vu comment manager son projet en séparant ses modifications en différents commits et branches. Nous avions obtenu un « projet » GIT simple, avec un simple fichier README, existant dans deux branches sous deux versions différentes. Ce sera notre point de départ, pour apprendre 4 nouvelles commandes GIT qui nous permettrons de travailler avec plusieurs dossiers ou repositories.

Travailler sur plusieurs repositories

1) clone

Notre première commande nous permettra de dupliquer un repositorie. Elle se nomme, comme de juste, clone.

Positionnons-nous (avec la console) dans le dossier dans lequel nous voulons créer notre nouveau dossier, et tapons la commande GIT :

clone /path/de/mon/premier/dossier nom_du_nouveau_dossier

Nous pouvons voir que notre dossier est bien cloné, que son historique est bien ici et que le projet comprend une unique branche : master. Tiens, on avait pas plusieurs branches dans notre repositorie originel ?

Bon, on avait donc plusieurs branches. Le problème c’est que la commande clone copie les branches, mais cache toutes les autres branches que master. Nous allons donc intégrer une commande qui les révèle :

git branche -a 

Pour travailler dessus, il faut qu’on annonce la demande explicitement avec le flag b de checkout. La commande est :

git checkout -b branch_name branch/path

Et voilà, on a notre repository et toutes les branches qui nous intéressent !

2) push et pull

Maintenant que nous avons nos deux repositories, nous allons pouvoir travailler. Modifions le readme et commitons. Nos deux repositories sont maintenant différents. Pour synchroniser, nous avons deux choix. Il est possible de « pousser » les modifications du répertoire de destination au répertoire cible. Il est également possible d’aller dans le répertoire cible et de « tirer » les modifications.

La commande pour pousser est push, suivi du repository cible et de la branche.

Attention : il est impossible de pousser sur la branche courante d’un répertoire. Faites bien attention, pour la prochaine étape, que le répertoire git-tutorial soit sur la branche master, vu que nous allons pousser sur la commande testing.

Tapons donc : git push origin testing.

Et voilà, notre branche distante est maintenant à jour ! Remettons nous sur la branche testing, puis remodifions le fichier README. Commitons, puis changeons d’endroit. Direction notre répertoire git-tutorial. De là, tapons la commande :

git pull origin testing

Ah, une erreur : la remote « origin » n’existe pas. Une remote est l’adresse d’un autre répertoire et effectivement nous ne l’avons pas créée. Nous allons le faire tout de suite avec la commande remote 

git remote add origin /path/to/directory 

Après avoir réessayer avec le pull, notre répertoire est à jour.

Si vous avez eu une erreur, c’est que votre repository n’est pas clean. Comprenez par là qu’il y a des changements non commités. Cela n’est bloquant que quand ces changements sont sur un des fichiers qui vas être modifié par le pull. Essayez donc de checkout ou de commit ces changements, puis réessayez.

Si les deux répertoires ont des modifications, comment fait-on pour synchroniser ?

Pour commencer, modifiez les deux readme de manières différentes, en pensant bien à commiter. Les modifications doivent intervenir sur la même ligne, disons la première.

Pour synchroniser les deux repositories, nous devons d’abord « merger » les deux répertoires sur un seul. Pour ça, il suffit de pull depuis un des deux repositories. Les modifications apportées par les commit de l’autre répertoire seront appliquées sur le nôtre. Si les fichiers modifiés sont différents ou bien si les modifications d’un même fichier touchent des lignes différentes, le merge sera automatique et rien ne vous sera demandé.

Par contre, ici, il vas y avoir un conflit, vu qu’on a modifié la première ligne de README sur les deux repo. Essayez avec la commande : 

 git pull origin master

Il y a bien un conflit. En cas d’oubli, nous pouvons le vérifier avec le statut du repository. Tapez git status, il y a un fichier dans « unmerged path ». Nous devons merger manuellement le fichier puis le marquer comme ok.

Pour faire cela, ouvrez le dans un éditeur de texte.

Notre version est dans « head », et l’autre est nommée par le commit qui l’a modifié. Il faut corriger le fichier, enregistrer, puis faire un git add sur le fichier incriminé pour que GIT sache que cette version est la bonne. Nous pouvons ensuite commiter le merge (notez que le message de validation renvoyé par la commande est merge et pas commit). Pour synchroniser l’autre répertoire, nous devons encore push nos modifications sur origin, comme tout à l’heure (pensez à faire attention à la version en cours de vos branches).

Voilà, nos deux repo sont a jour.

Dans un précédent tutoriel, nous avions parlé de branches. Sachez qu’il est possible de merger deux branches avec la commande git merge. L’action se fait exactement de la même manière qu’en faisant un pull depuis une branche distante. Si tout va bien, le merge est automatique, sinon il faut merger avec la même technique que celle décrite précédemment.

Conclusion

Nous avons vu comment travailler avec deux dossiers, mais uniquement en local, ce qui n’est pas très utile pour collaborer dans la plupart des cas. Pour travailler à plusieurs, sachez que le chemin du repository d’en face peut très bien être distant, les informations passeront donc par SSH. Cette solution, bien que pratique car ne demandant pas d’installation, n’est pas idéale, car on se retrouve assez souvent avec des problèmes de droits quand on veut push. Il faut également faire attention à la branche courante. De plus, elle demande aux deux ordianteurs d’être allumés et connectés pour fonctionner.

Le mieux reste de passer par un serveur que ce soit avec github, gitorious ou bien un gitosis hébergé sur un serveur personnel. 

Pour aller plus loin, je vous conseille d’aller vous inscrire sur Github et de lire leur documentation. En quelques minutes, vous pourrez ouvrir votre premier repository et pourrez push dessus.