2008-03-27 01:54:40 +01:00
|
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
|
<!DOCTYPE html
|
|
|
|
|
PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN"
|
|
|
|
|
"tuteurs://DTD/tml.dtd">
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
2008-03-27 02:00:08 +01:00
|
|
|
|
<title>Git</title>
|
2008-03-27 01:54:40 +01:00
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
|
|
|
|
|
<h1>Contrôle de versions avec Git</h1>
|
|
|
|
|
|
|
|
|
|
<h2>C'est quoi ?</h2>
|
|
|
|
|
|
|
|
|
|
<p>Le logiciel <code>git</code> est utilisé notamment par les développeurs
|
|
|
|
|
du noyau Linux. Il s'agit d'un logiciel de contrôle de version, comme SVN,
|
|
|
|
|
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.</p>
|
|
|
|
|
|
|
|
|
|
<p>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.</p>
|
|
|
|
|
|
|
|
|
|
<p>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.</p>
|
|
|
|
|
|
|
|
|
|
<p>À l'inverse, pour travailler à deux, <code>git</code> é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.</p>
|
|
|
|
|
|
|
|
|
|
<p>J'expliquerai ici comment se servir de la version 1.5 de
|
|
|
|
|
git. Dans la version 1.4, par exemple, la commande <code>git init</code>
|
|
|
|
|
est appelée <code>git init-db</code>. Cette dernière, dans la version
|
|
|
|
|
1.5, n'est qu'un autre nom pour <code>git init</code>.</p>
|
|
|
|
|
|
|
|
|
|
<h2>Créer un dépôt git</h2>
|
|
|
|
|
|
|
|
|
|
<p>Pour créer un dépôt <code>git</code>, il suffit de taper la commande
|
|
|
|
|
suivante dans son répertoire de travail (que nous désignerons dans la
|
|
|
|
|
suite par <code>monsiteweb</code>).</p>
|
|
|
|
|
|
|
|
|
|
<pre>git init</pre>
|
|
|
|
|
|
|
|
|
|
<p>Le dépôt est initialement vide. Imaginons que l'on souhaite
|
|
|
|
|
suivre les modifications du fichier <code>sommaire.html</code> qui se
|
|
|
|
|
trouve dans le répertoire <code>monsiteweb</code>.</p>
|
|
|
|
|
|
|
|
|
|
<pre>git add sommaire.html
|
|
|
|
|
git commit</pre>
|
|
|
|
|
|
|
|
|
|
<p>La première indique à git notre modification : le fichier
|
|
|
|
|
<code>sommaire.html</code> 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 <code>git commit</code> sert à enregistrer dans le dépôt les
|
|
|
|
|
modifications apportées.</p>
|
|
|
|
|
|
|
|
|
|
<p>Lors d'un <em>check-in</em> (avec la commande <code>git
|
|
|
|
|
commit</code>), git demande un texte de journal (<em>commit
|
|
|
|
|
log</em>). 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.</p>
|
|
|
|
|
|
|
|
|
|
<p>La commande <code>git add</code> 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.</p>
|
|
|
|
|
|
|
|
|
|
<pre>git init
|
|
|
|
|
git add *
|
|
|
|
|
git commit</pre>
|
|
|
|
|
|
|
|
|
|
<div class="encadre">Le dépôt git est enregistré dans le sous-répertoire
|
|
|
|
|
<code>.git</code> 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 <em>commit</em> 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 <code>ls</code>,
|
|
|
|
|
puisque son nom commence par un point. Les dépôts git peuvent être
|
|
|
|
|
compressés pour occuper moins de place (voir la commande <code>git
|
|
|
|
|
repack</code> et <code>git gc</code>).</div>
|
|
|
|
|
|
|
|
|
|
<p>On dispose d'une interface graphique (<code>git-gui</code>) et d'une
|
|
|
|
|
interface Web (gitweb) pour explorer agréablement un dépôt git.</p>
|
|
|
|
|
|
|
|
|
|
<h2>Travailler sur un projet géré par git</h2>
|
|
|
|
|
|
|
|
|
|
<p>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
|
|
|
|
|
<code>/home/xanadu/these</code>, le dénommé Yoda peut l'aider en clonant
|
|
|
|
|
son dépôt par la commande suivante</p>
|
|
|
|
|
|
|
|
|
|
<pre>git clone /home/xanadu/these cible</pre>
|
|
|
|
|
|
|
|
|
|
<p class="continue">où <code>cible</code> est le répertoire qui contiendra la copie. Yoda
|
|
|
|
|
peut alors travailler librement dans le répertoire <code>cible</code> comme
|
|
|
|
|
sur n'importe quel dépôt git dont il est le propriétaire.</p>
|
|
|
|
|
|
|
|
|
|
<div class="encadre">Ceci s'applique également aux projets situés sur des
|
|
|
|
|
machines distantes. On peut ainsi remplacer le répertoire par une adresse
|
|
|
|
|
du type <code>ssh://login@machine/home/xanadu/these</code>, si le
|
|
|
|
|
répertoire se trouve sur une machine à laquelle on accède par
|
|
|
|
|
<code>ssh</code>. La plupart des projets de logiciels libres indiquent des
|
|
|
|
|
adresses de la forme <code>git://git.logiciel.org/trunk</code> ou encore
|
|
|
|
|
<code>http://git.logiciel.org/trunk</code>.</div>
|
|
|
|
|
|
|
|
|
|
<p>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</p>
|
|
|
|
|
|
|
|
|
|
<pre>git commit -a</pre>
|
|
|
|
|
|
|
|
|
|
<p>qui lui demande un texte de description pour le journal des
|
|
|
|
|
modifications.</p>
|
|
|
|
|
|
|
|
|
|
<p>Si d'aventure Xanadu continuait de travailler sur son projet, Yoda peut
|
|
|
|
|
importer les dernières modifications en lançant la commande
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>git pull</pre>
|
|
|
|
|
|
|
|
|
|
<p>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
|
|
|
|
|
<code>/home/yoda/cible</code>, elle peut lancer la commande suivante chez
|
|
|
|
|
elle.</p>
|
|
|
|
|
|
|
|
|
|
<pre>git pull /home/yoda/cible</pre>
|
|
|
|
|
|
|
|
|
|
<p>Si Yoda pouvait accéder en écriture aux fichiers de Xanadu, il
|
|
|
|
|
pourrait également lui transmettre ses modifications par la commande
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>git push</pre>
|
|
|
|
|
|
|
|
|
|
<p>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</p>
|
|
|
|
|
|
|
|
|
|
<pre>git remote add yoda /home/yoda/cible</pre>
|
|
|
|
|
|
|
|
|
|
<p>La commande <code>git remote show yoda</code> permet de consulter
|
|
|
|
|
les informations sur le dépôt de Yoda, et <code>git pull yoda</code>
|
|
|
|
|
permet de récupérer directement ses modifications. On peut également
|
|
|
|
|
utiliser les commandes </p>
|
|
|
|
|
|
|
|
|
|
<pre>git fetch yoda
|
|
|
|
|
git merge yoda/master</pre>
|
|
|
|
|
|
|
|
|
|
<p class="encadre">Ici, <code>master</code> 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 <code>git remote show</code> permet de
|
|
|
|
|
voir la liste des branches d'un dépôt enregistré dans la liste des
|
|
|
|
|
<em>remotes</em></p>
|
|
|
|
|
|
|
|
|
|
<h2>Travailler sur un projet géré par Subversion</h2>
|
|
|
|
|
|
|
|
|
|
<p>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 <code>git-svn</code>. Ceci permet, par
|
|
|
|
|
exemple, de travailler facilement à plusieurs sur un sous-projet donné, en
|
|
|
|
|
envoyant périodiquement le résultat du travail.</p>
|
|
|
|
|
|
|
|
|
|
<pre>git-svn clone http://svn.site.org/svnroot/projet -T trunk -b branches -t tags</pre>
|
|
|
|
|
|
|
|
|
|
<p>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
|
|
|
|
|
<code>git-gc</code> permet de compresser les données et réduit l'espace
|
|
|
|
|
occupé à l'ordre de grandeur de la taille d'un <em>checkout</em> Subversion
|
|
|
|
|
(mais ici on garde tout l'historique).</p>
|
|
|
|
|
|
|
|
|
|
<p>On peut alors travailler normalement sur son dépôt. Les
|
|
|
|
|
commandes</p>
|
|
|
|
|
<pre>git-svn rebase
|
|
|
|
|
git-svn dcommit</pre>
|
|
|
|
|
<p class="continue">permettent respectivement de recevoir et d'envoyer les modifications
|
|
|
|
|
apportées.</p>
|
|
|
|
|
|
|
|
|
|
<h2>Travailler sur un projet géré par CVS</h2>
|
|
|
|
|
|
|
|
|
|
<p>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
|
|
|
|
|
<code>git-cvsimport</code>.</p>
|
|
|
|
|
|
|
|
|
|
<pre>git-cvsimport -d:pserver:anonymous@cvs.truc.org:/sources projet</pre>
|
|
|
|
|
|
|
|
|
|
<p class="encadre">On peut ajouter l'option <code>-p -Z,3</code> pour
|
|
|
|
|
activer la compression. Pour utiliser <code>git-cvsimport</code>, il faut
|
|
|
|
|
au préalable s'assurer de la présence du programme <code>cvsps</code> sur
|
|
|
|
|
son ordinateur.</p>
|
|
|
|
|
|
|
|
|
|
<h2>Travailler sur un projet géré par Arch</h2>
|
|
|
|
|
|
|
|
|
|
<p>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
|
|
|
|
|
<code>git-archimport</code>.</p>
|
|
|
|
|
|
|
|
|
|
<pre><span class="prompt">machine $</span> tla register-archive http://arch.foobar.org/archives/software
|
|
|
|
|
user@arch.foobar.org
|
|
|
|
|
<span class="prompt">machine $</span> tla my-default-archive user@arch.foobar.org
|
|
|
|
|
<span class="prompt">machine $</span> git-archimport software--devo--0:master</pre>
|
|
|
|
|
|
|
|
|
|
<p class="encadre">L'utilisation de <code>git-archimport</code> requiert la présence
|
|
|
|
|
du client <code>tla</code> qui est la façon la plus commune d'accéder aux
|
|
|
|
|
dépôts GNU Arch.</p>
|
|
|
|
|
|
|
|
|
|
<h2>En savoir plus</h2>
|
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
<li>Le <a href="http://git.or.cz/">site officiel</a></li>
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<div class="metainformation">
|
|
|
|
|
Auteur : Rémy Oudompheng.
|
2008-03-27 02:00:08 +01:00
|
|
|
|
Dernière modification le <date value="$Date: 2008-03-27 01:00:08 $" />.
|
2008-03-27 01:54:40 +01:00
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|