Contrôle de versions avec Git

C'est quoi ?

Le logiciel git est utilisé notamment par les développeurs du noyau Linux. Il s'agit d'un logiciel de contrôle de version, comme Subversion, CVS, Arch ou encore Darcs, qui utilise des dépôts décentralisés. Il permet ainsi de travailler tout en gardant une trace des modifications apportées successivement, et de retrouver ainsi l'état antérieur de ses données. À titre d'exemple, git est le logiciel utilisé par les Tuteurs pour gérer cette documentation.

Il permet également, comme beaucoup de ses congénères, de travailler à plusieurs sur un même projet. Mais contrairement à CVS ou Subversion, par exemple, Git ne fait pas de différence entre un dépôt principal et les copies locales chez les différents contributeurs.

Ce système permet également une organisation hiérarchisée de gros projets, comme c'est le cas du noyau Linux, en rendant complètement naturelle l'existence de dépôts alternatifs pour chaque sous-projet, avec une granularité de modifications très fine, et à plus grande échelle, une faible granularité du dépôt principal qui reçoit périodiquement les modifications par paquets.

À l'inverse, pour travailler à deux, git évite le casse-tête des droits d'accès dans le dépôt de l'autre. On peut en effet travailler de manière totalement symétrique, chacun recopiant les modifications de l'autre : il suffit d'un accès en lecture aux fichiers de ses collaborateurs.

J'expliquerai ici comment se servir de la version 1.5 de git. Dans la version 1.4, par exemple, la commande git init est appelée git init-db. Cette dernière, dans la version 1.5, n'est qu'un autre nom pour git init.

Créer un dépôt git

Pour créer un dépôt git, il suffit de taper la commande suivante dans son répertoire de travail (que nous désignerons dans la suite par monsiteweb).

git init

Le dépôt est initialement vide. Imaginons que l'on souhaite suivre les modifications du fichier sommaire.html qui se trouve dans le répertoire monsiteweb.

git add sommaire.html
git commit

La première indique à git notre modification : le fichier sommaire.html existe et doit être pris en compte. Il n'est pas toujours pertinent de suivre les modifications de n'importe quel fichier. En particulier, lorsque des fichiers sont engendrés automatiquement à partir de fichiers source, ce sont les fichiers source et les générateurs qu'il est important de conserver. La commande git commit sert à enregistrer dans le dépôt les modifications apportées.

Lors d'un check-in (avec la commande git commit), git demande un texte de journal (commit log). Ce texte permet de repérer facilement les modifications effectuées par chaque commit, aussi bien pour les autres que pour soi-même. Chaque commit est identifié par un numéro unique, représenté comme une suite de chiffres hexadécimaux. Ce numéro sert de référence, par exemple, lors qu'on veut annuler une modification.

La commande git add ajoute un fichier dans le dépôt. On peut également s'en servir pour des répertoires entiers. Les commandes suivantes permettent ainsi de créer et remplir un dépôt git dans un répertoire avec tout son contenu.

git init
git add * 
git commit
Le dépôt git est enregistré dans le sous-répertoire .git du répertoire où il a été créé. Ce dépôt peut différer du contenu du répertoire proprement dit, si on a modifié les fichiers depuis le dernier commit ou si on a importé les modifications d'un autre contributeur. Noter que ce répertoire est souvent invisible dans les explorateurs de fichiers et dans la sortie de la commande ls, puisque son nom commence par un point. Les dépôts git peuvent être compressés pour occuper moins de place (voir la commande git repack et git gc).

On dispose d'une interface graphique (git-gui) et d'une interface Web (gitweb) pour explorer agréablement un dépôt git.

Travailler sur un projet géré par git

Une autre manière de créer un dépôt git consiste à cloner un dépôt déjà existant. Si la dénommée Xanadu possède un dépôt git dans son répertoire /home/xanadu/these, le dénommé Yoda peut l'aider en clonant son dépôt par la commande suivante

git clone /home/xanadu/these cible

cible est le répertoire qui contiendra la copie. Yoda peut alors travailler librement dans le répertoire cible comme sur n'importe quel dépôt git dont il est le propriétaire.

Ceci s'applique également aux projets situés sur des machines distantes. On peut ainsi remplacer le répertoire par une adresse du type ssh://login@machine/home/xanadu/these, si le répertoire se trouve sur une machine à laquelle on accède par ssh. La plupart des projets de logiciels libres indiquent des adresses de la forme git://git.logiciel.org/trunk ou encore http://git.logiciel.org/trunk.

Yoda effectue alors quelques opérations sur les fichiers. Il enregistre régulièrement ses modifications dans le dépôt proprement dit en tapant

git commit -a

qui lui demande un texte de description pour le journal des modifications.

Si d'aventure Xanadu continuait de travailler sur son projet, Yoda peut importer les dernières modifications en lançant la commande

git pull

dans son dépôt. Quant à Xanadu, si elle veut bénéficier des modifications apportées par Yoda, se trouvant dans le répertoire /home/yoda/cible, elle peut lancer la commande suivante chez elle.

git pull /home/yoda/cible

Si Yoda pouvait accéder en écriture aux fichiers de Xanadu, il pourrait également lui transmettre ses modifications par la commande

git push

Entraînée par sa paresse naturelle, Xanadu aimerait facilement récupérer les modifications de Yoda sans avoir à se rappeler le répertoire exact où il les enregistre. Elle définit donc un raccourci de la manière suivante

git remote add yoda /home/yoda/cible

La commande git remote show yoda permet de consulter les informations sur le dépôt de Yoda, et git pull yoda permet de récupérer directement ses modifications. On peut également utiliser les commandes

git fetch yoda
git merge yoda/master

Ici, master est la branche du dépôt de Yoda que Xanadu souhaite utiliser. Un dépôt git peut comporter plusieurs branches correspondant à autant de directions différentes de développement. Ce système permet d'essayer diverses orientations, avant de retenir la meilleure. La commande git remote show permet de voir la liste des branches d'un dépôt enregistré dans la liste des remotes

Travailler sur un projet géré par Subversion

Contrairement à git, Subversion, dans un usage normal, ne clone pas entièrement le dépôt distant avec ses modifications successives, mais conserve seulement une copie de la dernière version. Il est possible d'utiliser le modèle de travail de git tout en interagissant avec un dépôt Subversion en utilisant le script git-svn. Ceci permet, par exemple, de travailler facilement à plusieurs sur un sous-projet donné, en envoyant périodiquement le résultat du travail.

git-svn clone http://svn.site.org/svnroot/projet -T trunk -b branches -t tags

La commande précédente permet d'importer la totalité d'un projet Subversion, avec ses différentes branches et tags (correpondant généralement aux différentes versions publiées). Attention, cela prend généralement beaucoup de place. Cependant, l'utilisation de git-gc permet de compresser les données et réduit l'espace occupé à l'ordre de grandeur de la taille d'un checkout Subversion (mais ici on garde tout l'historique).

On peut alors travailler normalement sur son dépôt. Les commandes

git-svn rebase
git-svn dcommit

permettent respectivement de recevoir et d'envoyer les modifications apportées.

Travailler sur un projet géré par CVS

Pour aspirer le contenu d'un dépôt CVS avec son historique et l'enregistrer sous forme de dépôt git, on dispose de la commande git-cvsimport.

git-cvsimport -d:pserver:anonymous@cvs.truc.org:/sources projet

On peut ajouter l'option -p -Z,3 pour activer la compression. Pour utiliser git-cvsimport, il faut au préalable s'assurer de la présence du programme cvsps sur son ordinateur.

Travailler sur un projet géré par Arch

Pour aspirer le contenu d'un dépôt Arch avec son historique et l'enregistrer sous forme de dépôt git, on dispose de la commande git-archimport.

machine $ tla register-archive http://arch.foobar.org/archives/software
user@arch.foobar.org
machine $ tla my-default-archive user@arch.foobar.org
machine $ git-archimport software--devo--0:master

L'utilisation de git-archimport requiert la présence du client tla qui est la façon la plus commune d'accéder aux dépôts GNU Arch.

En savoir plus

Auteur : Rémy Oudompheng.