diff --git a/logiciels/git/index.tml b/logiciels/git/index.tml new file mode 100644 index 0000000..232f33e --- /dev/null +++ b/logiciels/git/index.tml @@ -0,0 +1,237 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html + PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN" + "tuteurs://DTD/tml.dtd"> +<html> + <head> + <title>Subversion</title> + </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. +Dernière modification le <date value="$Date: 2008-03-27 00:54:40 $" />. +</div> + +</body> +</html>