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
.
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
.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.
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
où 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.
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
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.
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.
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.