<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Git Attitude]]></title>
  <link href="http://www.git-attitude.fr/atom.xml" rel="self"/>
  <link href="http://www.git-attitude.fr/"/>
  <updated>2013-06-13T17:50:38+02:00</updated>
  <id>http://www.git-attitude.fr/</id>
  <author>
    <name><![CDATA[Christophe Porteneuve]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Un prompt Git qui déchire]]></title>
    <link href="http://www.git-attitude.fr/2013/05/22/prompt-git-qui-dechire/"/>
    <updated>2013-05-22T00:00:00+02:00</updated>
    <id>http://www.git-attitude.fr/2013/05/22/prompt-git-qui-dechire</id>
    <content type="html"><![CDATA[<p>Dans l&#8217;univers des utilisateurs de Git, il y a ceux qui sont encore cantonnés à l&#8217;interface graphique (c&#8217;est bien triste, ils n&#8217;utilisent pas 2% de la puissance quotidienne de l&#8217;outil) et ceux qui sont passés à la <strong>ligne de commande</strong> (CLI, bravo à eux).</p>

<p>Mais même au sein de ces derniers, une part encore trop grande ne recourt pas à un <strong>prompt personnalisé</strong> pour disposer à tout moment d&#8217;<strong>informations importantes</strong> sur leur dépôt local et leur copie de travail, sans parler d&#8217;une <strong>complétion intelligente</strong> sur les commandes Git.</p>

<p>Cet article vise à vous aider à <strong>optimiser votre prompt</strong> quand vous êtes dans vos dépôts Git.</p>

<!-- more -->


<h2>C&#8217;est quoi un prompt ?</h2>

<p>C&#8217;est le texte qui est affiché avant chaque <em>invite de commande</em> dans une session <em>shell</em>.  Par exemple, dans une invite de commande Windows classique, c&#8217;est généralement juste le chemin suivi d&#8217;un chevron fermant, du genre :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="go">C:\Users\Tristounet&gt; _</span>
</span></code></pre></td></tr></table></div></figure>


<p>Sur les système Linux/Unix, la plupart des gens ont un prompt par défaut qui affiche leur identifiant, le nom de la machine, et le chemin courant, suivis d&#8217;un <code>$</code> s&#8217;ils sont des utilisateurs classiques ou de <code>#</code> s&#8217;ils sont le super-utilisateur, <code>root</code> :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="go">tdd@CodeWeaver:js-attitude $ _</span>
</span></code></pre></td></tr></table></div></figure>


<p>Selon le <em>shell</em> utilisé (<code>cmd</code> ou PowerShell sous Windows, une pléthore sur Linux/Unix dont émergent principalement Bash et ZSH), ce <em>prompt</em> se configure de diverses façons, le plus souvent au moyen de variables d&#8217;environnement dédiées, voire d&#8217;une fonction shell spécifique.</p>

<h2>Pourquoi un prompt personnalisé ?</h2>

<p>Beaucoup de gens configurent leur <em>prompt</em> pour ajuster l&#8217;ordre d&#8217;affichage des infos, en ajouter, coloriser des parties, indiquer automatiquement si la dernière commande a rencontré une erreur, etc.</p>

<h3>Informations immédiates sur l&#8217;état / le statut</h3>

<p>Dans cet esprit d&#8217;informations complémentaires, il est possible de recourir à des fichiers spécifiques de Git pour y incruster plein d&#8217;infos utiles sur le dépôt courant, son index et sa copie de travail, afin…</p>

<ul>
<li>de <strong>gagner du temps</strong> (inutile de les demander explicitement)</li>
<li>mais aussi d&#8217;<strong>éviter de nombreux pièges</strong> en remarquant <em>en amont</em> qu&#8217;on n&#8217;est pas dans l&#8217;état où on croyait (ex. il reste de l&#8217;<em>untracked</em>, y&#8217;a du <em>modified</em>, la branche active n&#8217;est pas la bonne, etc.).</li>
</ul>


<p>Pour cela, on va personnaliser les variables qui gouvernent la construction du <em>prompt</em> à chaque invite de commande.</p>

<h3>Complétion intelligente</h3>

<p>Il ne s&#8217;agit pas du <em>prompt</em> à proprement parler, mais il est également possible de renseigner auprès de notre <em>shell</em> une gestion de complétion (généralement avec la touche <code>Tab</code>) pour les diverses commandes de Git, et même pour les arguments de ces commandes !</p>

<p>Ce confort supplémentaire n&#8217;est pas anodin, en ce qu&#8217;il rend de nombreux aliases (raccourcis) superflus, et <strong>accélère considérablement</strong> la saisie des commandes.</p>

<h2>Les cas déjà gérés</h2>

<p>Selon votre situation technique, vous avez déjà plus ou moins de choses qui sont configurées pour vous côté <em>prompt</em> et complétion.</p>

<h3>Oh-my-Zsh</h3>

<p>Pour ceux qui utilisent ZSH au travers de l&#8217;excellentissime projet <a href="https://github.com/robbyrussell/oh-my-zsh">Oh My ZSH</a>, ils disposent automatiquement d&#8217;une prise en charge des dépôts Git et d&#8217;un grand nombre de <a href="https://github.com/robbyrussell/oh-my-zsh/wiki/Themes">thèmes</a> (du sublime à l&#8217;immonde) pour personnaliser leur affichage.</p>

<p>Vous y noterez un recours fréquent aux caractères Unicode et à la palette 256 couleurs.  Utiliser un terminal moderne est donc recommandé.</p>

<h3>mSysGit (Windows)</h3>

<p>Curieusement, les utilisateurs de Git sous Windows, au travers de mSysGit, sont déjà pas mal lotis puisque la complétion et le <em>prompt</em> sont déjà en place dans le <strong>Git Bash</strong> installé par l&#8217;outil.</p>

<p>Seul bémol : la configuration par défaut omet certaines infos, notamment les <em>untracked</em>, il faudra donc personnaliser un peu le fichier <code>.bashrc</code> à la racine du compte utilisateur pour améliorer l&#8217;affichage obtenu.  Vous verrez comment dans un instant.</p>

<h2>Se configurer ça à la main</h2>

<p>Pour les utilisateurs de ZSH, vous êtes sensés être des utilisateurs avancés, je vous laisse donc aller fouiller dans les fichiers fournis par <a href="https://github.com/robbyrussell/oh-my-zsh">Oh My ZSH</a> pour y trouver votre bonheur.</p>

<p>Les utilisateurs de Bash auront besoin de trois choses :</p>

<ol>
<li>Charger les fichiers de prompt/complétion s&#8217;ils ne sont pas auto-chargés</li>
<li>Définir les variables d&#8217;environnement contrôlant l&#8217;affichage par la fonction de prompt Git</li>
<li>Modifier la définition du <em>prompt</em> pour recourir à ladite fonction</li>
</ol>


<h3>Le fichier de configuration du <em>shell</em></h3>

<p>Suivant le système que vous utilisez et la façon dont vous ouvrez votre <em>shell</em>, Bash reconnaît trois <strong>fichiers de configuration</strong>, tous placés à la <strong>racine de votre compte utilisateur</strong>.</p>

<p>Cette racine est du style <code>C:\Documents and Settings\TonPtitNom</code> ou <code>C:\Users\TonPtitNom</code> sur Windows, <code>/home/tonptitnom</code> sur Linux/Unix et <code>/Users/tonptitnom</code> sur OSX.</p>

<p>Les trois fichiers concernés sont <code>.bashrc</code>, <code>.bash_profile</code> et <code>.profile</code>.  <strong>Linux/Unix</strong> utilise généralement les deux premiers : l&#8217;un contient les instructions d&#8217;initialisation tandis que l&#8217;autre se contente de lui déléguer le travail.  <strong>OSX</strong> a tendance à favoriser <code>.profile</code> pour son Terminal.</p>

<p><strong>mSysGit</strong> n&#8217;en propose aucun par défaut, mais vous pourrez créer <code>.bashrc</code> manuellement (<strong>attention</strong> toutefois à la majorité des éditeurs Windows qui refuseront de créer un fichier commençant par un point : ils colleront sûrement une extension <code>.txt</code> supplémentaire derrière, il vous faudra ouvrir le Git Bash et faire <code>mv .bashrc.txt .bashrc</code> pour le renommer correctement afin qu&#8217;il soit utilisé par le <em>shell</em>).</p>

<p>Dans la suite de cet article, nous ferons référence au fichier qui concerne votre cas de figure sous le nom générique « fichier de configuration ».</p>

<h3>Localiser les fichiers contribués</h3>

<p>C&#8217;est ici que ça varie pas mal suivant votre contexte technique.</p>

<p>Si vous utilisez mSysGit, vous n&#8217;avez rien à faire côté fichiers, il vous suffira de manipuler les variables d&#8217;environnement tout à l&#8217;heure.</p>

<p>Dans les autres cas basés sur Bash, tout dépend de comment vous avez installé Git.</p>

<p>Si vous êtes passés par un <strong>paquet Linux/Unix classique</strong>, vous avez probablement le fichier de complétion déjà posé à la bonne place.  C&#8217;est généralement dans <code>/etc/bash_completion.d</code>, et ça s&#8217;appelle soit <code>git</code> (un seul fichier), soit <code>git-completion.bash</code> et <code>git-prompt.sh</code> (deux fichiers).  Dans les deux cas, vu qu&#8217;ils sont placés dans ce dossier, ils sont auto-chargés.</p>

<p>Si c&#8217;est auto-chargé, vous n&#8217;avez rien à faire à la section suivante (« Activer la complétion »), passez directement aux sections de configuration du prompt.</p>

<h3>Activer la complétion</h3>

<p>Restent les cas d&#8217;installation manuelle, au travers d&#8217;une compilation des sources ou, plus automatiquement, de Homebrew sur OSX.</p>

<p>Dans le cas d’une <strong>compilation manuelle</strong>, cherchez vos fichiers de complétion.  Ils sont probablement quelque part dans <code>/usr/local</code>, par exemple <code>/usr/local/git/contrib/completion</code>.  Supposons que ce soit le cas, vous devrez rajouter au fichier de configuration la ligne suivante (adaptez aux noms de fichier que vous y aurez trouvés) :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">source</span> /usr/local/git/contrib/completion/git-completion.bash
</span><span class='line'><span class="nb">source</span> /usr/local/git/contrib/completion/git-prompt.sh
</span></code></pre></td></tr></table></div></figure>


<p>Dans le cas de <strong>Homebrew</strong>, ils sont normalement dans le <code>etc/bash_completion.d</code> du <strong>préfixe Homebrew</strong>, qui est par défaut <code>/usr/local</code>.  Les scripts de ce répertoire sont alors traités automatiquement par un script général <code>etc/bash_completion</code>. Histoire d&#8217;être génériques, on va lui demander de nous sortir ça et on teste autour pour ne pas se faire mal plus tard.  Ajoutez ceci à votre fichier de configuration :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="k">if</span> <span class="o">[</span> -f <span class="k">$(</span>brew --prefix<span class="k">)</span>/etc/bash_completion <span class="o">]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">  </span><span class="nb">source</span> <span class="k">$(</span>brew --prefix<span class="k">)</span>/etc/bash_completion
</span><span class='line'><span class="k">fi</span>
</span></code></pre></td></tr></table></div></figure>


<p>Une fois que vous avez bidouillé <strong>et sauvé</strong> (si si, plein de gens oublient…) votre fichier de configuration, ouvrez directement un nouveau terminal pour vérifier que vous n&#8217;avez pas d&#8217;erreur au démarrage (regardez bien ce qui s&#8217;affiche dès le lancement !).</p>

<p>Tapez ensuite <code>git</code>, une espace, et la touche <code>Tab</code> (une ou deux fois, suivant votre terminal) : si vous voyez apparaître une liste de commandes Git, on a gagné.  Si vous voyez juste les fichiers du répertoire courant, on a perdu, et il vous va falloir examiner votre configuration pour trouver ce qui cloche.</p>

<h3>Configurer un prompt simple</h3>

<p>Commençons avec un <em>prompt</em> simple, qui reproduirait uniquement la version classique en incrustant si besoin des infos Git.  Cette section est longue mais c&#8217;est parce qu&#8217;on teste plusieurs configurations d&#8217;affichage, n&#8217;ayez pas peur…</p>

<p>Nous allons personnaliser la variable spéciale de Bash nommée <code>PS1</code>.  Cette variable agit comme un <strong>motif évalué à chaque invite de commande</strong>.  Elle peut contenir des codes spéciaux sous forme d&#8217;un caractère précédé d&#8217;une barre oblique inverse (antislash : <code>\</code>).  Par exemple, un prompt classique est de la forme :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">export </span><span class="nv">PS1</span><span class="o">=</span><span class="s1">&#39;\u@\h:\w \$ &#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Décryptons un brin :</p>

<ul>
<li><code>\u</code> est l&#8217;identifiant de l&#8217;utilisateur courant</li>
<li><code>\h</code> est le premier segment du nom de la machine courante (avant un éventuel premier <code>.</code>)</li>
<li><code>\w</code> est le chemin complet du répertoire courant, l&#8217;éventuelle racine de votre compte étant abrégée en <code>~</code> (par exemple, au lieu de <code>/Users/tdd/js-attitude</code>, on verrait <code>~/js-attitude</code>)</li>
<li><code>\$</code> affichera <code>#</code> ou <code>$</code> suivant que l&#8217;on est super-utilisateur ou non</li>
<li>Les autres caractères (<code>@</code>, <code>:</code>, les espaces) sont littéraux.</li>
</ul>


<p>Vous trouverez la liste complète des codes dans l&#8217;aide de Bash (<code>man bash</code>), à la section <code>PROMPTING</code>.</p>

<p>Ce qui nous intéresse nous, c&#8217;est qu&#8217;on peut utiliser la syntaxe d&#8217;imbrication d&#8217;exécution de Bash pour évaluer une fonction Bash et en récupérer l&#8217;affichage, directement dans le motif du <em>prompt</em>.  Cette syntaxe est de la forme <code>$(ligne de commande)</code>, et nous aurons ici recours à une fonction dédiée, <code>__git_ps1</code>, fournie par les fameux scripts qu&#8217;on s&#8217;est échinés à trouver puis charger quelques paragraphes plus haut.</p>

<p>Le prompt final donnerait ceci :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">export </span><span class="nv">PS1</span><span class="o">=</span><span class="s1">&#39;\u@\h:\w$(__git_ps1) \$ &#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notez qu&#8217;il est possible de passer à <code>__git_ps1</code> un motif <code>printf</code> pour formater son affichage.  Par défaut, il s&#8217;agit de <code>" (%s)"</code>. Le <code>%s</code> sera remplacé par le texte issu de la commande.</p>

<p>Mettez à jour votre <code>PS1</code> en fin du fichier de configuration, puis rechargez-le en tapant <code>source nom-du-fichier</code>, ou ouvrez un nouveau terminal.</p>

<p>Vérifiez déjà que votre <em>prompt</em> n&#8217;a pas d&#8217;entrée de jeu une sale tête, ou affiche une erreur.  Il devrait être comme avant (sauf si vous l&#8217;aviez personnalisé, auquel cas préférez incruster où bon vous semble <code>$(__git_ps1)</code> dans le motif que vous aviez déjà).</p>

<p>Si <strong>dès l&#8217;ouverture d&#8217;un terminal, à la racine de votre compte, vous voyez s&#8217;afficher des infos entre parenthèses</strong> (sans doute après qu&#8217;un certain temps de gel apparent a passé) c&#8217;est que vous avez créé un <strong>dépôt Git à la racine de votre compte, voire plus haut</strong> (le pire cas possible étant <code>/</code>, la racine absolue).  Un tel cas est plus que probablement une erreur, et vous devrez retirer/déplacer le dossier <code>.git</code> correspondant si vous souhaitez utiliser le prompt, car dans une telle situation, à chaque <em>prompt</em>, <em>tous les sous-dossiers de celui contenant le <code>.git</code> seront examinés en profondeur pour déterminer l&#8217;état à afficher</em>, ce qui est catastrophique en performances.</p>

<p>Si tout va bien, déplacez-vous dans un dépôt Git local (à défaut, créez-en un pour voir : <code>mkdir /tmp/toto &amp;&amp; cd /tmp/toto &amp;&amp; git init</code>) : vous devriez voir apparaître, entre parenthèses, au minimum le nom de la branche courante, suivi potentiellement de plusieurs symboles.</p>

<p><img src="http://www.git-attitude.fr/images/git-prompt-simple.png" width="621" height="27" title="Un prompt Git basique" ></p>

<p>Par défaut, seules les modifications dans la copie locale (<em>dirty</em>) et l&#8217;index (<em>staged</em>) sont signalées, au moyen des symboles <code>*</code> et <code>+</code>, respectivement.  Suivant la version de Git utilisée, vous disposez de plus ou moins de réglages, au travers de variables d&#8217;environnement.</p>

<p>Sur Git 1.8.1.2 par exemple, ces variables sont :</p>

<ul>
<li><code>GIT_PS1_SHOWDIRTYSTATE</code> : signaler les modifs à la copie locale (symbole <code>*</code>) et à l&#8217;index (le <em>stage</em>, symbole <code>+</code>).</li>
<li><code>GIT_PS1_SHOWSTASHSTATE</code> : signaler la présence d&#8217;entrées dans le <em>stash</em> (symbole <code>$</code>)</li>
<li><code>GIT_PS1_SHOWUNTRACKEDFILES</code> : signaler la présence de fichiers ni versionnés ni ignorés (donc <em>untracked</em>) dans la copie locale (symbole <code>%</code>).</li>
<li><code>GIT_PS1_SHOWUPSTREAM</code> : indiquer le rapport entre la branche locale et sa version trackée (en retard <code>&lt;</code>, en avance <code>&gt;</code>, synchro <code>=</code> ou ayant divergé <code>&lt;&gt;</code>).  Les affichages peuvent être modifiés selon la valeur de la variable ; les symboles décrits ici sont pour la valeur <code>auto</code>, mais on en a d&#8217;autres, notamment <code>verbose</code>.  Voyez votre script de prompt pour les détails.</li>
<li><code>GIT_PS1_DESCRIBE_STYLE</code> peut prendre diverses valeurs pour représenter un <em>detached HEAD</em> ; par défaut (<code>default</code>), on a l&#8217;<em>abbreviated SHA</em> mais on a d&#8217;autres options, la plus utile étant probablement <code>branch</code>.</li>
</ul>


<p>Eh ben, ça fait déjà du monde !</p>

<p>Du coup, pour personnaliser un peu votre prompt, définissons les variables qui vont bien au sein de votre fichier de configuration, par exemple juste avant de redéfinir <code>PS1</code> :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">export </span><span class="nv">GIT_PS1_SHOWDIRTYSTATE</span><span class="o">=</span>1 <span class="nv">GIT_PS1_SHOWSTASHSTATE</span><span class="o">=</span>1 <span class="nv">GIT_PS1_SHOWUNTRACKEDFILES</span><span class="o">=</span>1
</span><span class='line'><span class="nb">export </span><span class="nv">GIT_PS1_SHOWUPSTREAM</span><span class="o">=</span>verbose <span class="nv">GIT_PS1_DESCRIBE_STYLE</span><span class="o">=</span>branch
</span></code></pre></td></tr></table></div></figure>


<p><img src="http://www.git-attitude.fr/images/git-prompt-parametre.png" width="668" height="36" title="Un prompt Git bien paramétré" ></p>

<p>Notez le <code>%</code> en plus (puisque j&#8217;ai de l&#8217;<em>untracked</em>, là…) et le <code>u+1</code> qui m&#8217;indique en l&#8217;occurrence que j&#8217;ai un commit d&#8217;avance sur la branche distante, et aucun commit en retard.</p>

<h3>Configurer un prompt avancé</h3>

<p>Pour obtenir davantage de notre <em>prompt</em>, il nous faut recourir à une autre variable Bash que <code>PS1</code>, à savoir la bien-nommée <code>PROMPT_COMMAND</code>.</p>

<p>Cette variable contient une ligne de commande Bash complète (en général un appel de fonction, les instructions complexes étant dans la fonction) qui va être exécutée à chaque invite.  Elle n&#8217;a pas pour but de renvoyer un texte, mais fait tout ce qu&#8217;elle veut <em>et l&#8217;affichage</em> directement.  Libre à elle, donc, de faire du multi-ligne, de découper sa sortie à gauche et à droite à l&#8217;aide des codes ANSI VT-x, etc.</p>

<p>Avant d&#8217;entrer dans des commandes de fou, commençons juste par faire l&#8217;équivalent de ce qu&#8217;on avait jusqu&#8217;ici, mais en mode commande au lieu du motif de <em>prompt</em>.  Il suffit de remplacer la ligne où nous définissions <code>PS1</code> par celle-ci :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">export </span><span class="nv">PROMPT_COMMAND</span><span class="o">=</span><span class="s1">&#39;__git_ps1 &quot;\u@\h:\w&quot; &quot; \\\$ &quot;&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Vous voyez ici qu&#8217;on appelle <code>__git_ps1</code> avec deux arguments : le préfixe et le suffixe de l&#8217;éventuel affichage Git-spécifique.  Dans cette syntaxe, si vous vouliez préciser un motif de formatage, il aurait fait l&#8217;objet d&#8217;un troisième argument.  L&#8217;antislash avant le dollar est triplé car on est dans une chaîne interprétée (guillemets droits <code>"</code>), il y a donc déjà un premier niveau d&#8217;échappement utilisé d&#8217;entrée de jeu.</p>

<p>Ce qui est sympa avec ce mode, c&#8217;est qu&#8217;il nous permet de demander la colorisation du texte affiché par <code>__git_ps1</code>, en ajoutant à nos variables de configuration <code>GIT_PS1_SHOWCOLORHINTS=1</code> :</p>

<p><img src="http://www.git-attitude.fr/images/git-prompt-colorise.png" width="660" height="27" title="Un prompt Git colorisé" ></p>

<p>On peut bien sûr aller beaucoup plus loin en créant ses propres fonctions.  Ainsi, Matthew McCullough, le principal formateur Git chez Github, maintient dans <a href="https://github.com/matthewmccullough/dotfiles">ses fichiers de conf</a> un <em>prompt</em> personnalisé plutôt bourrin, qui recourt librement aux caractères Unicode :</p>

<figure class='code'><figcaption><span>Le prompt Git Bash de Matthew McCullough </span><a href='https://github.com/matthewmccullough/dotfiles/blob/master/bash_gitprompt'>Consulter sur Github </a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/bash</span>
</span><span class='line'>
</span><span class='line'><span class="c">########################################################################</span>
</span><span class='line'><span class="c"># Matthew&#39;s Git Bash Prompt</span>
</span><span class='line'><span class="c">########################################################################</span>
</span><span class='line'>        <span class="nv">RED</span><span class="o">=</span><span class="s2">&quot;\[\033[0;31m\]&quot;</span>
</span><span class='line'>     <span class="nv">YELLOW</span><span class="o">=</span><span class="s2">&quot;\[\033[0;33m\]&quot;</span>
</span><span class='line'>    <span class="nv">GREEN</span><span class="o">=</span><span class="s2">&quot;\[\033[0;32m\]&quot;</span>
</span><span class='line'>       <span class="nv">BLUE</span><span class="o">=</span><span class="s2">&quot;\[\033[0;34m\]&quot;</span>
</span><span class='line'>  <span class="nv">LIGHT_RED</span><span class="o">=</span><span class="s2">&quot;\[\033[1;31m\]&quot;</span>
</span><span class='line'><span class="nv">LIGHT_GREEN</span><span class="o">=</span><span class="s2">&quot;\[\033[1;32m\]&quot;</span>
</span><span class='line'>      <span class="nv">WHITE</span><span class="o">=</span><span class="s2">&quot;\[\033[1;37m\]&quot;</span>
</span><span class='line'> <span class="nv">LIGHT_GRAY</span><span class="o">=</span><span class="s2">&quot;\[\033[0;37m\]&quot;</span>
</span><span class='line'> <span class="nv">COLOR_NONE</span><span class="o">=</span><span class="s2">&quot;\[\e[0m\]&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="k">function </span>parse_git_branch <span class="o">{</span>
</span><span class='line'>  git rev-parse --git-dir &amp;&gt; /dev/null
</span><span class='line'>  <span class="nv">git_status</span><span class="o">=</span><span class="s2">&quot;$(git status 2&gt; /dev/null)&quot;</span>
</span><span class='line'>  <span class="nv">branch_pattern</span><span class="o">=</span><span class="s2">&quot;^# On branch ([^${IFS}]*)&quot;</span>
</span><span class='line'>  <span class="nv">remote_pattern</span><span class="o">=</span><span class="s2">&quot;# Your branch is (.*) of&quot;</span>
</span><span class='line'>  <span class="nv">diverge_pattern</span><span class="o">=</span><span class="s2">&quot;# Your branch and (.*) have diverged&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span> <span class="o">[[</span> ! <span class="k">${</span><span class="nv">git_status</span><span class="k">}</span><span class="o">}</span> <span class="o">=</span>~ <span class="s2">&quot;working directory clean&quot;</span> <span class="o">]]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">    </span><span class="nv">state</span><span class="o">=</span><span class="s2">&quot;${RED}⚡&quot;</span>
</span><span class='line'>  <span class="k">fi</span>
</span><span class='line'>  <span class="c"># add an else if or two here if you want to get more specific</span>
</span><span class='line'>  <span class="k">if</span> <span class="o">[[</span> <span class="k">${</span><span class="nv">git_status</span><span class="k">}</span> <span class="o">=</span>~ <span class="k">${</span><span class="nv">remote_pattern</span><span class="k">}</span> <span class="o">]]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">    if</span> <span class="o">[[</span> <span class="k">${</span><span class="nv">BASH_REMATCH</span><span class="p">[1]</span><span class="k">}</span> <span class="o">==</span> <span class="s2">&quot;ahead&quot;</span> <span class="o">]]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">      </span><span class="nv">remote</span><span class="o">=</span><span class="s2">&quot;${YELLOW}↑&quot;</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'><span class="k">      </span><span class="nv">remote</span><span class="o">=</span><span class="s2">&quot;${YELLOW}↓&quot;</span>
</span><span class='line'>    <span class="k">fi</span>
</span><span class='line'><span class="k">  fi</span>
</span><span class='line'><span class="k">  if</span> <span class="o">[[</span> <span class="k">${</span><span class="nv">git_status</span><span class="k">}</span> <span class="o">=</span>~ <span class="k">${</span><span class="nv">diverge_pattern</span><span class="k">}</span> <span class="o">]]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">    </span><span class="nv">remote</span><span class="o">=</span><span class="s2">&quot;${YELLOW}↕&quot;</span>
</span><span class='line'>  <span class="k">fi</span>
</span><span class='line'><span class="k">  if</span> <span class="o">[[</span> <span class="k">${</span><span class="nv">git_status</span><span class="k">}</span> <span class="o">=</span>~ <span class="k">${</span><span class="nv">branch_pattern</span><span class="k">}</span> <span class="o">]]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">    </span><span class="nv">branch</span><span class="o">=</span><span class="k">${</span><span class="nv">BASH_REMATCH</span><span class="p">[1]</span><span class="k">}</span>
</span><span class='line'>    <span class="nb">echo</span> <span class="s2">&quot; (${branch})${remote}${state}&quot;</span>
</span><span class='line'>  <span class="k">fi</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">function </span>git_dirty_flag <span class="o">{</span>
</span><span class='line'>  git status 2&gt; /dev/null | grep -c : | awk <span class="s1">&#39;{if ($1 &gt; 0) print &quot;⚡&quot;}&#39;</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">function </span>prompt_func<span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="nv">previous_return_value</span><span class="o">=</span><span class="nv">$?</span>;
</span><span class='line'>    <span class="c">#The lowercase w is the full current working directory</span>
</span><span class='line'>    <span class="c">#prompt=&quot;${TITLEBAR}${BLUE}[${RED}\w${GREEN}$(parse_git_branch)${BLUE}]${COLOR_NONE}&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c">#Capital W is just the trailing part of the current working directory</span>
</span><span class='line'>    <span class="nv">prompt</span><span class="o">=</span><span class="s2">&quot;${TITLEBAR}${BLUE}[${RED}\W${GREEN}$(parse_git_branch)${BLUE}]${COLOR_NONE}&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if </span><span class="nb">test</span> <span class="nv">$previous_return_value</span> -eq 0
</span><span class='line'>    <span class="k">then</span>
</span><span class='line'><span class="k">        </span><span class="nv">PS1</span><span class="o">=</span><span class="s2">&quot;${prompt}&gt; &quot;</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'><span class="k">        </span><span class="nv">PS1</span><span class="o">=</span><span class="s2">&quot;${prompt}${RED}&gt;${COLOR_NONE} &quot;</span>
</span><span class='line'>    <span class="k">fi</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="nv">PROMPT_COMMAND</span><span class="o">=</span>prompt_func
</span></code></pre></td></tr></table></div></figure>


<p>Pour la même situation que tout à l&#8217;heure, ça donne ceci :</p>

<p><img src="http://www.git-attitude.fr/images/git-prompt-matthew.png" width="245" height="25" title="le prompt Git Bash version Matthew McCullough" ></p>

<p>Chez Matthew, l&#8217;écart avec la branche distante trackée utilise des flèches simples ou doubles, et tout état non « clean tree » affiche juste un éclair.  On pourrait bien sûr revenir au chemin complet, identifiant et nom de machine, etc. en plus de ces infos et de leur colorisation, et détailler les états locaux distincts.</p>

<p>L&#8217;important, c&#8217;est que c&#8217;est un script, votre script, et que vous pouvez donc tout faire :-)</p>

<h2>Envie d&#8217;en savoir plus ?</h2>

<p>Nos formations <a href="http://www.git-attitude.fr/git-au-quotidien/">Git au Quotidien</a> explorent en profondeur les questions de configuration, de prompt et d&#8217;options avancées ou méconnues pour les commandes même les plus simples.  Une excellente façon d&#8217;aller bien au-delà de ces quelques réglages !</p>

<ul data-upcoming-sessions="git-au-quotidien"></ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Formations Attitude : un premier bilan]]></title>
    <link href="http://www.git-attitude.fr/2013/04/22/attitude-un-premier-bilan/"/>
    <updated>2013-04-22T00:00:00+02:00</updated>
    <id>http://www.git-attitude.fr/2013/04/22/attitude-un-premier-bilan</id>
    <content type="html"><![CDATA[<p>Pour un organisme de formation, le mois d&#8217;avril est l&#8217;échéance de dépôt du <em>Bilan Pédagogique et Financier</em> (BPF), pour lequel nous devons compulser toutes sortes de statistiques et compteurs sur nos stagiaires, sessions, heures de formations, origines des règlements, etc.  C&#8217;est aussi amusant que de lire du COBOL à jeun.</p>

<p>Ceci étant dit, c&#8217;est l&#8217;occasion de faire le point sur l&#8217;évolution de notre activité de formation.  Et comme Attitude, c&#8217;est avant tout la transparence, je me suis dit que ça pourrait vous intéresser de voir d&#8217;où nous sommes partis et où nous en sommes.</p>

<p><em>(note : cet article est posté sur l&#8217;ensemble des sites Attitude)</em></p>

<!-- more -->


<h2>Pratiquement 3 ans</h2>

<p>Si Delicious Insights n&#8217;existe que depuis août 2011, notre activité de formation a démarré bien avant cela, sous d&#8217;autres formes : dès le 2 juillet 2010, pour être précis.  C&#8217;était la première formation <a href="http://www.git-attitude.fr/git-au-quotidien/">Git au Quotidien</a>, déjà chez Clever Age et à un tarif ubuesque pour les valeureux pionniers qui osaient l&#8217;aventure : 50€ la journée, déjeuner compris !</p>

<p>Lorsqu&#8217;en octobre j&#8217;expliquais l&#8217;idée derrière <a href="http://www.git-attitude.fr/">Git Attitude</a> aux copains pendant <a href="http://www.paris-web.fr/">Paris Web</a>, ce bon vieux <a href="http://jeremie.patonnier.net/">Jérémie Patonnier</a> m&#8217;a dit sur un ton débonnaire et détaché : « mais pourquoi tu ne fais pas la même chose avec JavaScript ? ». Après m&#8217;être tapé la tête contre le mur de ne pas y avoir pensé dès le début, j&#8217;ai donc lancé <a href="http://www.js-attitude.fr/">JS Attitude</a> avec tout d&#8217;abord <a href="http://www.js-attitude.fr/js-puissant/">JS Puissant</a> et une première session bondée (16 personnes !) le 27 novembre, vendue en quelques jours, presque quelques heures…</p>

<p>Voici un petit historique de jalons sélectionnés :</p>

<table>
<thead>
<tr>
<th>Date             </th>
<th> Jalon</th>
</tr>
</thead>
<tbody>
<tr>
<td>2 juillet 2010   </td>
<td> Lancement Git Attitude (Git Quotidien)</td>
</tr>
<tr>
<td>27 novembre 2011 </td>
<td> Lancement JS Attitude (JS Puissant)</td>
</tr>
<tr>
<td>19 février 2011  </td>
<td> Premier <a href="http://www.git-attitude.fr/git-avance/">Git Avancé</a></td>
</tr>
<tr>
<td>12 mars 2011     </td>
<td> <a href="http://www.js-attitude.fr/js-guru/">JS Guru</a> v1</td>
</tr>
<tr>
<td>mai 2011         </td>
<td> Premières sessions intra-entreprises (Blablacar / Comuto, Intel)</td>
</tr>
<tr>
<td>2 juillet 2011   </td>
<td> JS Guru v2</td>
</tr>
<tr>
<td><strong>26 août 2011</strong> </td>
<td> <strong>Immatriculation de Delicious Insights</strong></td>
</tr>
<tr>
<td>25 février 2012  </td>
<td> JS Guru v3</td>
</tr>
<tr>
<td>août 2012        </td>
<td> Nouvelle tarification (dont tarifs fidélité), passage des inter à <a href="http://www.git-attitude.fr/informations-generales/#le-lieu%20de%20formation">l&#8217;Espace La Rochefoucauld</a></td>
</tr>
<tr>
<td>septembre 2012   </td>
<td> Création du blockbuster <a href="http://www.js-attitude.fr/js-total/">JS Total</a> pour Digitas / Vivaki</td>
</tr>
<tr>
<td>décembre 2012    </td>
<td> Création de la formation <a href="http://www.js-attitude.fr/coffee-script/">CoffeeScript</a></td>
</tr>
<tr>
<td>15 novembre 2012 </td>
<td> Je passe à temps plein sur Delicious Insights</td>
</tr>
<tr>
<td>23 novembre 2012 </td>
<td> Première formation en anglais (Kelkoo)</td>
</tr>
<tr>
<td>mars 2013        </td>
<td> Premières formations intra à l&#8217;étranger (Bruxelles)</td>
</tr>
</tbody>
</table>


<h2>Quelques chiffres</h2>

<p>Je vous passe l&#8217;évolution d&#8217;un exercice fiscal à l&#8217;autre, mais sachez qu&#8217;aujourd&#8217;hui, Delicious Insights, au travers de Git Attitude et JS Attitude, c&#8217;est :</p>

<ul>
<li><strong>7 formations</strong> au catalogue (3 Git et 4 JavaScript)</li>
<li><strong>52 sessions</strong> déjà données, soit</li>
<li><strong>544 heures</strong> de formation à destination de</li>
<li><strong>444 stagiaires</strong> au sein de</li>
<li>plus de <strong>80 sociétés</strong> clientes (et de nombreux participants à titre personnel)</li>
</ul>


<p>Parmi nos clients, un équilibre surprenant entre TPE/PME, agences (TBWA, MRM Worldwide, Fullsix / Ekino…), SSII (Atos, Valtech…) et grands comptes (SNCF, Orange, EADS, Dassault, Intel, Alcatel-Lucent, 4D, FNAC, l’OCDE, Météo France, MisterGoodDeal, PriceMinister…).  Des clients situés dans 5 pays : France, Royaume-Uni, Belgique, Suisse et Luxembourg.</p>

<h2>Des stagiaires enchantés</h2>

<p>Tous nos stagiaires ont l&#8217;occasion de faire un retour à chaud en fin de session, face à face, ainsi qu&#8217;un retour à froid <em>via</em> un formulaire en ligne proposant des évaluations tant quantitatives (notes de 1 à 5) que qualitatives (texte libre).  Un bon tiers de nos stagiaires prennent le temps de le remplir (une proportion historique qui, toutefois, ne cesse de s&#8217;améliorer).  Nous n&#8217;avons rien à cacher, alors allez donc consulter un <a href="http://whygit.wufoo.com/reports/evaluation-des-ateliers-attitude/">rapport temps réel sur les retours qui nous sont faits</a>.</p>

<h2>Merci à vous</h2>

<p>Je voudrais profiter de cet article pour <strong>remercier très chaleureusement tous les stagiaires</strong> qui nous ont fait confiance jusqu&#8217;ici, et leurs employeurs qui ont accepté de les envoyer dans nos formations.  C&#8217;est un plaisir chaque fois renouvellé de vous transmettre tout ce qu&#8217;on peut, d&#8217;échanger avec vous et de lire vos retours !</p>

<h2>Et maintenant ?</h2>

<p>Eh bien, on va commencer par finir l&#8217;exercice en cours (au 30 juin), et préparer la rentrée…</p>

<p>Je souhaite rédiger <strong>davantage d&#8217;articles de fond</strong>, ainsi que de la retranscription de veille et des didacticiels sur diverses technos, sur les différents sites Attitude.</p>

<p>J&#8217;ai très envie de pouvoir mettre au catalogue des <strong>formations Node.js, Ruby et Rails</strong>, mais on verra si le temps de préparation ne fait pas trop défaut.</p>

<p>On va probablement élargir petit à petit le groupe de formateurs, aussi, en travaillant avec des personnes de confiance qu&#8217;on connaît de longue date, qui partagent notre philosophie, nos valeurs, et font preuve d&#8217;une expertise technique et d&#8217;une pédagogie à la hauteur de nos exigences.</p>

<p>Enfin, le catalogue de formations va faire l&#8217;objet au fur et à mesure d&#8217;une déclinaison sous forme de <strong>screencasts qualitatifs payants</strong>, d&#8217;une heure environ chacun, avec des possibilités d&#8217;achat par lot (pour toute la série &#8220;Git au Quotidien&#8221; par exemple), les stagiaires bénéficiant automatiquement d&#8217;un fort rabais sur ces derniers.</p>

<p>Espérons qu&#8217;on aura le temps de tout faire !</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Une configuration Git aux petits oignons]]></title>
    <link href="http://www.git-attitude.fr/2013/04/03/configuration-git/"/>
    <updated>2013-04-03T00:00:00+02:00</updated>
    <id>http://www.git-attitude.fr/2013/04/03/configuration-git</id>
    <content type="html"><![CDATA[<p>Git propose 3 niveaux de configuration :</p>

<ol>
<li><strong>Locale</strong>. Spécifique à chaque dépôt local, elle est stockée dans le <code>.git/config</code>.  On y trouve notamment les <em>trackings</em> de branches, le <em>remote</em>, etc.</li>
<li><strong>Globale</strong>.  Spécifique à l&#8217;utilisateur, elle est stockée à la racine de son compte, dans le fichier <code>~/.gitconfig</code>.  C&#8217;est celle qui nous intéresse ici.</li>
<li><strong>Système</strong>.  Généralement stockée dans <code>/etc/gitconfig</code>, elle est partagée par tous les utilisateurs.  Elle est rarement employée.</li>
</ol>


<p>Les priorités vont dans l&#8217;ordre usuel : du local au système.</p>

<p>La majorité des utilisateurs se contente de coller dans son <code>.gitconfig</code> ses nom, e-mail et préférences d&#8217;éditeur.  C&#8217;est là une sous-utilisation navrante.  De très nombreux aspects quotidiens de Git sont paramétrables, et donc améliorables, au travers de la configuration.</p>

<p>Cet article explore ma configuration personnelle pour vous faire découvrir de nombreuses astuces utiles.</p>

<!-- more -->


<p>Avant toute chose, assurez-vous que vous utilisez un Git récent (1.8+).  Plusieurs options de configuration évoquées ci-après n&#8217;ont fait leur apparition que récemment.  Si une option semble ignorée chez vous, vérifiez soigneusement son nom et sa valeur, puis jetez un œil aux <a href="https://github.com/git/git/tree/master/Documentation/RelNotes">notes de version</a> pour retrouver la version dans laquelle l&#8217;option est apparue.</p>

<p>Je maintiens une <strong>version publique générisée de ma configuration</strong> <a href="https://gist.github.com/tdd/470582">dans ce Gist</a>.  Par « générisée », je veux dire que j&#8217;en retire, ou que j&#8217;y commente, quelques traitements qui me semblent délicats à activer par défaut, car ils concernent des comportements subtils de Git qu&#8217;il vaut mieux bien connaître avant de les appliquer.</p>

<p>Un fichier de configuration Git est d&#8217;une syntaxe similaire à un bon vieux fichier INI : les sections sont délimitées par un en-tête <code>[nom.section]</code>, et les lignes de propriété qui suivent appartiennent à la section.  L&#8217;indentation est recommandée mais nullement obligatoire.  La représentation linéarisée d&#8217;une propriété est <code>section.nom</code>, par exemple <code>core.whitespace</code> pour la propriété <code>whitespace</code> au sein de la section <code>[core]</code>.</p>

<p>Voici déjà le gist global :</p>

<div><script src='https://gist.github.com/470582.js?file='></script>
<noscript><pre><code></code></pre></noscript></div>


<p>Examinons à présent les réglages un par un.</p>

<h2>Identité par défaut pour les commits</h2>

<p>C&#8217;est la base de la base : identifier vos commits à venir.  On utilise pour cela <code>user.name</code> et <code>user.email</code>.  Évitez toutefois de pourrir la config Git d&#8217;un utilisateur de déploiement sur un serveur de prod avec ce genre de trucs, si vous êtes plusieurs personnes à pouvoir déployer.  Préférez qualifier un éventuel commit en prod (ouh là là…) avec <code>git commit --author=…</code> afin de ne pas vous mélanger les pinceaux.</p>

<h2>Colorisation</h2>

<p>De nombreuses commandes Git sont capables de <strong>coloriser leur affichage</strong> à l&#8217;aide de codes ANSI VT lorsque le terminal le permet. La valeur <code>auto</code> a le même sens que dans de nombreuses autres commandes Linux (par exemple <code>ls</code>) : Git détectera s&#8217;il est utilisé en direct par un terminal VT capable de gérer les codes de couleur, et si c&#8217;est le cas, exploitera cette possibilité.</p>

<p>La propriété <code>color.ui</code> est un paravent générique pour l&#8217;ensemble des propriétés plus spécifiques de gestion de couleur, par exemple <code>color.branch</code>, <code>color.diff</code>, <code>color.grep</code>, <code>color.interactive</code>, etc.  En gros, <strong>on veut de la couleur !</strong></p>

<h2>Aliases</h2>

<p>Git ne permet par défaut que les noms de commande complets (<code>commit</code>, <code>checkout</code>, etc.), ce qui fait parfois rager les Subversioniens débutant sur Git, qui cherchent en vain leur <code>git ci</code>.  Outre qu&#8217;un prompt correctement configuré proposera une complétion avancée (ça fera l&#8217;objet d&#8217;un autre billet), la vraie raison est que <strong>Git permet de se créer autant d&#8217;aliases qu&#8217;on le désire</strong>, au moyen des réglages de la section <code>[alias]</code>.  Chaque propriété a pour nom celui de l&#8217;alias et pour valeur la ligne de commande Git sans le <code>git</code> initial.</p>

<p>Ma configuration prévoit 3 aliases sans lesquels je ne saurais bosser :</p>

<ul>
<li><code>ci</code> pour commit</li>
<li><code>st</code> pour status</li>
<li><code>lg</code> pour un log textuel avancé qui, en ce qui me concerne, est tout-à-fait à la hauteur des logs graphiques (graphe de branches et fusions, références symboliques, tags et têtes de branches, SHAs, auteurs et horodatage relatif). Et le bonus, c&#8217;est qu&#8217;il marche dans un terminal, donc <em>via</em> SSH…</li>
</ul>


<p><img src="http://www.git-attitude.fr/images/git-lg.png" width="779" height="223" title="Exemple d'affichage de git lg" ></p>

<h2>Pagination, whitespace et autres réglages « noyau »</h2>

<p>Par défaut, Git pagine tout ce qu&#8217;il affiche : si ça dépasse la hauteur du terminal, ça se prend un <code>less</code> dans la figure.  Personnellement, je ne supporte pas ça : si je veux paginer, je <code>| less</code> moi-même !  En spécifiant <em>via</em> <code>core.pager</code> de passer par <code>cat</code> plutôt que <code>less</code>, je désactive <em>de facto</em> la pagination.</p>

<p>Lorsqu&#8217;il <strong>ouvre un éditeur</strong> (notamment pour les messages de commit ou la mise en place d&#8217;un <code>rebase</code> interactif), Git choisit l&#8217;éditeur comme ceci :</p>

<ol>
<li>Variable d&#8217;environnement <code>GIT_EDITOR</code></li>
<li>Réglage <code>core.editor</code> (c&#8217;est ce que je préfère)</li>
<li>Variable d&#8217;environnement <code>VISUAL</code></li>
<li>Variable d&#8217;environnement <code>EDITOR</code></li>
<li>Binaire par défaut retenu à la compilation de Git ; en général, <code>vi</code>.</li>
</ol>


<p>Si le comportement par défaut n&#8217;est pas votre tasse de thé, il vous faut spécifier la ligne de commande à exécuter.  Lorsque l&#8217;éditeur est graphique, vous devrez l&#8217;invoquer de façon à ce qu&#8217;il soit en <em>wait mode</em>, c&#8217;est-à-dire qu&#8217;il ne rende la main qu&#8217;une fois le fichier fourni refermé.  Tous les éditeurs graphiques n&#8217;ont pas cette possibilité.</p>

<p>Voici une liste de lignes de commandes compilée au fil du temps ; vous allez voir, on distingue une tendance :-)…  Testez par vous-mêmes pour vérifier ce que ça donne, et si ça a changé, faites-moi signe en commentaires !</p>

<ul>
<li><strong>TextMate</strong> : l&#8217;invocation en ligne de commande <code>mate</code> doit être installée (ça se fait depuis <em>Help > Terminal Usage…</em> dans la v1 et depuis l&#8217;onglet <em>Terminal</em> des Préférences dans la v2), après quoi c&#8217;est juste <code>mate -w</code>.</li>
<li><strong>SublimeText</strong> : il faut avoir un appel en ligne de commande, là aussi.  Sur OSX avec ST2, j&#8217;ai un lien symbolique <code>/usr/local/bin/subl</code> vers <code>/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl</code>, qui est fourni pour ça.  Après quoi <code>subl -w</code>.</li>
<li><strong>GEdit</strong> : <code>gedit -w -s</code></li>
<li><strong>GVim</strong> : <code>gvim --nofork</code></li>
<li><strong>Coda</strong> : Il vous faut installer <a href="http://justinhileman.info/coda-cli/">coda-cli</a> (généralement via Homebrew, toujours aussi utile…) après quoi <code>coda -w</code>.</li>
<li><strong>Chocolat</strong> : Installez l&#8217;appel en ligne de commande (<em>Chocolat > Install Command Line Tool…</em>) après quoi <code>choc -w</code></li>
<li><strong>Notepad++</strong> : vous aurez peut-être besoin d&#8217;adapter le chemin en fonction de là où vous avez installé Notepad++, mais voici l&#8217;idée : <code>'C:/Program Files (x86)/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin</code>.</li>
<li><strong>Ultra-Edit</strong> : <code>uedit32 /fni</code></li>
</ul>


<p>Enfin, le réglage <code>core.whitespace</code> est là pour éviter que certains types de différences liées au <em>whitespace</em> ne soient détectés ou posent problème à des commandes comme <code>git diff</code>, <code>git add -p</code>, <code>git apply</code> ou <code>git rebase</code>.  Il existe toute une série de valeurs possibles et combinables ; <code>trailing-space</code> est une combo pour <code>blank-at-eol</code> (<em>whitespace</em> en fin de ligne) et <code>blank-at-eof</code> (<em>whitespace</em>, notamment lignes vides, en fin de fichier).  Comme j&#8217;indique ici cette valeur en négatif (notez le <code>-</code> préfixe), je précise que ce type d&#8217;écarts ne doit pas poser souci ni être signalé.</p>

<h2>Diffs améliorés</h2>

<p>Par défaut, toute forme de <code>diff</code> signale les deux versions comme <code>a</code> et <code>b</code> :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="gp">[15:54] tdd@CodeWeaver:git-attitude (master *+%) $</span> git diff 2013-04-03-configuration-git.markdown
</span><span class='line'><span class="go">diff --git a/source/_posts/2013-04-03-configuration-git.markdown b/source/_posts/2013-04-03-configuration-git.markdown</span>
</span><span class='line'><span class="go">index e69de29..44bd5ae 100644</span>
</span><span class='line'><span class="go">--- a/source/_posts/2013-04-03-configuration-git.markdown</span>
</span><span class='line'><span class="go">+++ b/source/_posts/2013-04-03-configuration-git.markdown</span>
</span></code></pre></td></tr></table></div></figure>


<p>Ce n&#8217;est pas toujours évident de savoir ce qu&#8217;est <code>a</code> et ce qu&#8217;est <code>b</code>… Le HEAD ? Le <em>stage</em> ? Le <em>working directory</em> ?  Récemment, Git a fourni un réglage, <code>diff.mnemonicPrefix</code>, qui lorsqu&#8217;il est à <code>true</code> va remplacer, lorsque c&#8217;est possible, ces initiales anonymes par trois autres :</p>

<ul>
<li><code>c</code> pour Commit (généralement le HEAD)</li>
<li><code>i</code> pour Index (le <em>stage</em>)</li>
<li><code>w</code> pour <em>Working directory</em></li>
</ul>


<p>Ainsi, un <code>diff</code> classique explicite qu&#8217;il est effectué entre le <em>stage</em> (l&#8217;index) et le <em>working directory</em> :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="gp">[16:02] tdd@CodeWeaver:_posts (master *+) $</span> git diff 2013-04-03-configuration-git.markdown
</span><span class='line'><span class="go">diff --git i/source/_posts/2013-04-03-configuration-git.markdown w/source/_posts/2013-04-03-configuration-git.markdown</span>
</span><span class='line'><span class="go">index 202f830..cde050e 100644</span>
</span><span class='line'><span class="go">--- i/source/_posts/2013-04-03-configuration-git.markdown</span>
</span><span class='line'><span class="go">+++ w/source/_posts/2013-04-03-configuration-git.markdown</span>
</span></code></pre></td></tr></table></div></figure>


<p>Un <code>diff --staged</code> indique bien qu&#8217;il est effectué entre le HEAD (un commit) et le <em>stage</em> (l&#8217;index) :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="gp">[16:02] tdd@CodeWeaver:_posts (master *+) $</span> git diff --staged 2013-04-03-configuration-git.markdown
</span><span class='line'><span class="go">diff --git c/source/_posts/2013-04-03-configuration-git.markdown i/source/_posts/2013-04-03-configuration-git.markdown</span>
</span><span class='line'><span class="go">index cde050e..202f830 100644</span>
</span><span class='line'><span class="go">--- c/source/_posts/2013-04-03-configuration-git.markdown</span>
</span><span class='line'><span class="go">+++ i/source/_posts/2013-04-03-configuration-git.markdown</span>
</span></code></pre></td></tr></table></div></figure>


<p>Quant à un <code>diff HEAD</code>, qui explicite son commit de référence, il confirme qu&#8217;il compare un commit et le <em>working directory</em> :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="gp">[16:02] tdd@CodeWeaver:_posts (master *+) $</span> git diff HEAD 2013-04-03-configuration-git.markdown
</span><span class='line'><span class="go">diff --git c/source/_posts/2013-04-03-configuration-git.markdown w/source/_posts/2013-04-03-configuration-git.markdown</span>
</span><span class='line'><span class="go">index cde050e..3f85496 100644</span>
</span><span class='line'><span class="go">--- c/source/_posts/2013-04-03-configuration-git.markdown</span>
</span><span class='line'><span class="go">+++ w/source/_posts/2013-04-03-configuration-git.markdown</span>
</span></code></pre></td></tr></table></div></figure>


<p>Un autre aspect un peu dommage de <code>git diff</code> est le comportement par défaut de <code>git diff --word-diff</code>.  S&#8217;il est bien agréable d&#8217;avoir par défaut un mode <em>word diff</em>, qui permet de cibler, au sein de deux lignes sans doute très similaires, la zone de différence (un peu comme le changement de contraste dans des outils de diff graphiques), Git considère par défaut comme « mot » toute séquence de caractères non-<em>whitespace</em>.  Dans un bloc de code, ça fait vite long, vu que les délimiteurs et opérateurs seront aussi comptabilisés.  Par exemple, <code>@twitterClient.directMessage(contact,</code> est considéré comme un mot. Snif.</p>

<p><img src="http://www.git-attitude.fr/images/git-diff-word.png" width="779" height="184" title="Un git diff --word-diff standard" ></p>

<p>C&#8217;est pourquoi <code>git diff</code> fournit une autre option, <code>--word-diff-regex=…</code>, qui permet de préciser une regex représentant un « mot ».  Naturellement, en réduisant cette regex à <code>.</code>, on va tenter la correspondance minimale (jusqu&#8217;à un seul caractère).  Dans la pratique, quand je fais un diff de niveau mot, je fais toujours comme ça.</p>

<p>C&#8217;est là tout l&#8217;intérêt du réglage <code>diff.wordRegex</code> : il permet de traiter un simple <code>--word-diff</code> comme un <code>--word-diff-regex=…</code>. Voyez plutôt :</p>

<p><img src="http://www.git-attitude.fr/images/git-diff-regex.png" width="779" height="182" title="Un git diff --word-diff en mode regex par défaut" ></p>

<h2>Submodules</h2>

<p><strong>Les submodules sont une mauvaise idée</strong>.  J&#8217;en reparlerai en détail dans un prochain article.  Toutefois, pour ceux qui sont empêtrés dans les emmerdes quotidiennes des submodules (il y a des pièges à foison dans leur maintenance au quotidien), divers réglages permettent, au fil des versions, d&#8217;ajouter des garde-fous.  J&#8217;en préconise quelques-uns :</p>

<ul>
<li><code>fetch.recurseSubmodules</code> détecte automatiquement lors d&#8217;un <code>fetch</code> (et donc d&#8217;un <code>pull</code>) si les références des submodules ont bougé, et propose de les récupérer automatiquement si c&#8217;est le cas. Attention, ça ne fait pas le <code>submodule update</code> pour autant.</li>
<li><code>status.submoduleSummary</code> prend soin de signaler dans <code>git status</code> les submodules dont la référence a bougé, en listant les deltas de commits concernés.</li>
</ul>


<h2>Regex étendues par défaut</h2>

<p>Git propose à de nombreux endroits de recourir aux <strong><a href="http://www.js-attitude.fr/2012/08/13/enfin-maitriser-les-expressions-rationnelles/">expressions rationnelles</a></strong> (regex).  Notamment <code>git log --grep</code> et <code>git log -G</code>, pour ne citer qu&#8217;eux.  Par défaut cependant, seules les BRE (<em>Basic Regular Expressions</em>) sont traitées, c&#8217;est-à-dire que la majorité des caractères spéciaux tels que <code>{}</code>, &#8216;()&#8217;, <code>+</code> et <code>?</code> sont ignorés.  Dans la pratique, quand j&#8217;utilise une regex, je veux toujours disposer de la <strong>syntaxe étendue</strong> (ERE, <em>Extended Regular Expressions</em>), qui active toutes les syntaxes possibles.</p>

<p>Plutôt que d&#8217;avoir alors à ajouter <code>-E</code> à ma ligne de commande, j&#8217;active le réglage <code>grep.extendedRegexp</code> dans la configuration globale.</p>

<p>Attention cependant : vos regex ne seront pas insensibles à la casse pour autant.  Si vous voulez garantir cela, vous devrez généralement ajouter <code>-i</code> à vos lignes de commande.</p>

<h2>Les SHA1 complets, ça ne sert à rien</h2>

<p>C&#8217;est un peu <a href="http://www.youtube.com/watch?v=ttPsIqQoK2k&amp;feature=youtu.be&amp;t=1m44s">comme le H de Hawai</a>.</p>

<p>La majorité des commandes de Git et de la documentation utilise des <em>abbreviated SHA1s</em>, ou <em>abbrevs</em>, soit les 7 premiers caractères seulement.  La probabilité de collision de valeurs effectives à 7 caractères de SHA1 est infinitésimale (je ne suis pas expert, mais ça doit plafonner à 2<sup>&minus;132</sup>, ce qui revient à dire que tu as à peine moins de chances de tomber sur un atome précis parmi tous ceux qui composent la Terre, nous inclus ; moi je dis, risque acceptable).</p>

<p>Histoire que même un bête <code>git log</code> sans options particulières se limite à ça, j&#8217;active <code>log.abbrevCommit</code>.</p>

<h2>Des fusions plus pratiques</h2>

<p>Si Git nous fournit effectivement pléthore de mécanismes afin de résoudre au mieux un conflit de fusion, il reste possible d&#8217;améliorer les comportements par défaut.</p>

<p>Ainsi, Git injecte dans les fichiers textuels des <strong>marqueurs de conflit</strong> classiques.  Par exemple :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>&lt;body&gt;
</span><span class='line'>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
</span><span class='line'>  &lt;h1&gt;Super site de gros bills&lt;/h1&gt;
</span><span class='line'>=======
</span><span class='line'>  &lt;h1&gt;Super site de malades&lt;/h1&gt;
</span><span class='line'>&gt;&gt;&gt;&gt;&gt;&gt;&gt; feature
</span><span class='line'>&lt;/body&gt;
</span></code></pre></td></tr></table></div></figure>


<p>Il est déjà possible d&#8217;obtenir davantage d&#8217;informations à ce stade, en affichant entre les deux (la branche récipiendaire de la fusion et la branche en cours de fusion) la version du texte dans <em>l&#8217;ancêtre commun</em> (le point de divergence).  C&#8217;est le mode <strong>diff3</strong>, que j&#8217;active automatiquement avec le réglage <code>merge.conflictStyle</code> :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>&lt;body&gt;
</span><span class='line'>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
</span><span class='line'>  &lt;h1&gt;Super site de gros bills&lt;/h1&gt;
</span><span class='line'>||||||| merged common ancestors
</span><span class='line'>  &lt;h1&gt;Super site de oufs&lt;/h1&gt;
</span><span class='line'>=======
</span><span class='line'>  &lt;h1&gt;Super site de malades&lt;/h1&gt;
</span><span class='line'>&gt;&gt;&gt;&gt;&gt;&gt;&gt; feature
</span><span class='line'>&lt;/body&gt;
</span></code></pre></td></tr></table></div></figure>


<p>Par ailleurs, lorsqu&#8217;on recourt à un <strong>outil de résolution de conflits</strong> (un <em>mergetool</em>), celui-ci peut générer des fichiers temporaires ou de sauvegarde (souvent avec des extensions genre <code>.rej</code>, <code>.orig</code>, <code>.local</code>, <code>.tmp</code>, <code>.bak</code>…), qui viennent joyeusement pourrir votre <em>working directory</em>.  Même si ces extensions sont protégées contre un ajout par inadvertance à l&#8217;aide d&#8217;un <code>.gitignore</code> ou équivalent, les fichiers restent là.</p>

<p>Vous pouvez vous assurer que votre outil va nettoyer derrière lui en désactivant les réglages <code>mergetool.keepBackup</code> et <code>mergetool.keepTemporaries</code>.</p>

<p>Pour finir sur les <em>mergetools</em>, lorsqu&#8217;on lance <code>git mergetool</code>, il demande par défaut confirmation quant au fichier à manipuler.  Afin de vous éviter cette question le plus souvent superflue, désactivez <code>mergetool.prompt</code>.</p>

<p>Un autre sujet important, sur lequel j&#8217;écrirai un article un de ces jours, est Rerere.  Cette fonctionnalité avancée de Git permet d&#8217;enregistrer (localement) des empreintes de conflits et les résolutions manuelles que vous leur avez apportées, pour ré-utiliser automatiquement ces résolutions par la suite.  C&#8217;est extrêmement pratique et permet des <em>workflows</em> très puissants.  Je vous invite à aller explorer la doc à ce sujet, et si vous souhaitez vous en servir, vous n&#8217;aurez qu&#8217;à activer <code>rerere.enabled</code> et, si vous souhaitez mettre automatiquement dans le <em>stage</em> ces résolutions automatisées, <code>rerere.autoupdate</code>.</p>

<h2>Des pulls en rebase par défaut</h2>

<p>J&#8217;écrirai prochainement un article détaillé sur les raisons pour lesquelles j&#8217;estime que l&#8217;immense majorité des <em>pulls</em> devraient utiliser un <code>rebase</code> plutôt qu&#8217;un <code>merge</code>.  En gros, il s&#8217;agit d&#8217;éviter de pourrir l&#8217;historique quand on est à plusieurs à committer en même temps sur la même branche partagée.</p>

<p>La commande <code>git pull</code> est en fait une séquence de deux commandes plus spécifiques : <code>git fetch</code> suivie de <code>git merge</code>.  Par exemple, si vous êtes sur <code>master</code> avec un <em>remote</em> par défaut <code>origin</code>, <code>git pull</code> revient à faire :</p>

<ol>
<li><code>git fetch</code></li>
<li><code>git merge origin/master</code></li>
</ol>


<p>Quand vous bossez à plusieurs sur la branche, il est le plus souvent préférable de faire l&#8217;équivalent de :</p>

<ol>
<li><code>git fetch</code></li>
<li><code>git rebase origin/master</code></li>
</ol>


<p>Git anticipe ce scénario et vous le permet avec <code>git pull --rebase</code>.  Toutefois, il devrait s&#8217;agir à mon sens du cas général, et non du cas particulier.  Il est en effet devenu possible de bosser ainsi en activant l&#8217;option <code>pull.rebase</code>.</p>

<p>Le seul danger potentiel, c&#8217;est qu&#8217;un <code>rebase</code>, par défaut, « <em>inline</em> » les fusions. C&#8217;est ajustable quand on <code>git rebase</code> manuellement, mais pas dans le cadre d&#8217;un <em>pull</em>.  Prenons un exemple.</p>

<p>Disons que  vous venez de procéder à une fusion légitime sur votre branche locale (par exemple, la branche <code>feature</code> était terminée et vous avez procédé à son rapatriement sur <code>master</code> à l&#8217;aide d&#8217;un <code>git merge feature</code>).</p>

<p>Le <em>push</em> vous est refusé car il s&#8217;avère que le <code>master</code> distant (<code>origin/master</code>) a bougé. Pas le choix, vous faites un <code>pull</code> avant de continuer.  Si celui-ci est en mode <em>rebase</em>, vous allez automatiquement <em>rebaser</em> l&#8217;historique local récent (les commits depuis votre ancienne référence <code>origin/master</code>, dont votre commit de fusion) sur le nouveau <code>origin/master</code>.  En temps normal c&#8217;est top, mais sur ce coup ça va <em>inliner</em> la fusion en remplaçant le <em>true merge</em> par un <em>rebase</em>.  La branche, jusqu&#8217;ici bien visible dans le graphe du log, va disparaître.</p>

<p>Ma recommandation est la suivante :</p>

<ol>
<li>Si vous vous apprêtez à fusionner une branche et que vous avez l&#8217;excellente habitude de nettoyer votre historique local avant de <em>pusher</em>, faites-le dès maintenant (vous ne pourrez plus le faire après sans <em>inliner</em> la fusion).</li>
<li><em>Pullez</em> ensuite immédiatement, en mode <em>rebase</em>.  Ce sera toujours ça comme risque en moins pour après.</li>
<li>Effectuez la fusion.</li>
<li><em>Pushez</em> immédiatement ; si un petit malin a remis à jour le <em>remote</em> entre-temps, au pire, faites un <code>git pull --no-rebase</code> juste pour cette fois.  L&#8217;historique ne sera pas bien joli, mais bon.</li>
</ol>


<p>À noter que le recours à Rerere (voir plus haut) permet de préparer la fusion à l&#8217;avance (en résolvant d&#8217;éventuels conflits), puis l&#8217;annuler, et dans le cadre de la séquence ci-dessus, d&#8217;être certain que l&#8217;étape 3 sera très courte, laissant d&#8217;autant moins de temps aux copains pour refaire bouger le <em>remote</em>.</p>

<h2>Des pushes plus ciblés</h2>

<p>Par défaut, <code>git push</code> tente de publier toutes vos branches homonymes au <em>remote</em>.  S&#8217;il m&#8217;arrive très rarement d&#8217;avoir de nouveaux travaux sur plusieurs branches en local qui soient trackées sur le <em>remote</em>, et donc d&#8217;avoir besoin de ça, il m&#8217;arrive en revanche régulièrement de tomber dans le scénario suivant :</p>

<ol>
<li>Je dois collaborer quelques temps à la branche <code>feature</code> : je <code>git checkout feature</code>, ce qui cale une branche locale trackée sur la distante.</li>
<li>Je bosse, je committe, je pushe, tout roule…</li>
<li>Au bout d&#8217;un moment, soit ça fait un bail que je ne bosse que sur <code>feature</code> et mon <code>master</code> prend du retard sur le distant, soit j&#8217;ai fini avec <code>feature</code> jusqu&#8217;à nouvel ordre, je repasse sur <code>master</code> et au bout d&#8217;un moment ma <code>feature</code> locale est en retard sur la version distante.</li>
</ol>


<p>À ce moment-là, <strong>chaque push va me taper dessus</strong> en rejetant la ou les branches en retard.  C&#8217;est assez pénible, parce que je ne cherche pas en fait à <em>pusher</em> ces branches, je les ai juste en local et je rebosserai sans doute dessus plus tard. C&#8217;est le mode <em>matching</em>, qui comme le dit la doc n&#8217;est pas approprié à un environnement multi-développeurs, mais est (jusqu&#8217;à Git 2.0 en tout cas) le mode par défaut.</p>

<p>En réglant <code>push.default</code> à <code>upstream</code>, je change le comportement par défaut de <code>push</code> afin qu&#8217;il ne se préoccupe <strong>que de la branche active</strong>.  C&#8217;est une variante plus flexible du mode <code>simple</code>, qui exigerait que les branches locale et distante soient non seulement connectées (<em>tracking</em>) mais homonymes.  À noter que ce mode <code>simple</code> sera le mode par défaut à partir de Git 2.0.</p>

<h2>En conclusion…</h2>

<p>Bon, voilà une bonne chose de faite !  Pensez à jeter un œil aux <a href="https://github.com/git/git/tree/master/Documentation/RelNotes">notes de version</a> quand vous mettez à jour votre Git, et surtout à regarder de temps en temps ce qu&#8217;on trouve dans <code>git help config</code>, qui liste tous les réglages proposés, ou simplement si le <code>git help</code> de votre commande en cours ne fournit pas une section <code>CONFIGURATION</code> sur la fin, qui cible les réglages associés.  On y apprend toujours plein de choses…</p>

<p>Bonne config à tous !</p>

<h2>Envie d&#8217;en savoir plus ?</h2>

<p>Nos formations <a href="http://www.git-attitude.fr/git-au-quotidien/">Git au Quotidien</a> explorent en profondeur les questions de configuration, de prompt et d&#8217;options avancées ou méconnues pour les commandes même les plus simples.  Une excellente façon d&#8217;aller bien au-delà de ces quelques réglages !</p>

<ul data-upcoming-sessions="git-au-quotidien"></ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Sessions Git 2ème trimestre 2013]]></title>
    <link href="http://www.git-attitude.fr/2013/03/12/sessions-q2-2013/"/>
    <updated>2013-03-12T00:00:00+01:00</updated>
    <id>http://www.git-attitude.fr/2013/03/12/sessions-q2-2013</id>
    <content type="html"><![CDATA[<p>Voici les dates des sessions inter-entreprises de mars à juin 2013 !</p>

<ol>
<li><a href="http://www.git-attitude.fr/git-au-quotidien/">Git au Quotidien</a> le 26/03 (plus qu&#8217;une place)</li>
<li><a href="http://www.git-attitude.fr/git-au-quotidien/">Git au Quotidien</a> le 26/04</li>
<li><a href="http://www.git-attitude.fr/git-avance/">Git Avancé</a> le 22/05</li>
<li><a href="http://www.git-attitude.fr/git-au-quotidien/">Git au Quotidien</a> le 20/06</li>
</ol>


<p>N&#8217;attendez pas ! Demandez rapidement vos conventions pour ces dates !</p>

<p>Et si vous avez un besoin suffisant en intra-entreprise, rejoignez les nombreuses sociétés qui ont déjà fait une formation <a href="http://www.git-attitude.fr/git-au-quotidien/">Git Quotidien</a> ou <a href="http://www.git-attitude.fr/git-total/">Git Total</a> en interne : faites une <a href="demander-une-intra-ou-custom/">demande de formation intra / sur mesure</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Sessions Git début 2013]]></title>
    <link href="http://www.git-attitude.fr/2012/11/17/sessions-debut-2013/"/>
    <updated>2012-11-17T00:00:00+01:00</updated>
    <id>http://www.git-attitude.fr/2012/11/17/sessions-debut-2013</id>
    <content type="html"><![CDATA[<p>Voici enfin les dates des sessions inter-entreprises de janvier et février 2013 !</p>

<ol>
<li><a href="http://www.git-attitude.fr/git-au-quotidien/">Git au Quotidien</a> le 29/01</li>
<li><del><a href="http://www.git-attitude.fr/git-avance/">Git Avancé</a> le 30/01</del> <em>(reporté au 27/03)</em></li>
</ol>


<p>En revanche, en raison d&#8217;un nombre d&#8217;inscriptions véritablement trop faible d&#8217;une part, et de besoins intra-entreprises trop forts d&#8217;autre part, nous avons dû annuler préemptivement la session <a href="http://www.git-attitude.fr/git-total/">Git Total</a> du 04 au 05/12.</p>

<p>Quant à la session <a href="http://www.git-attitude.fr/git-avance/">Git Avancé</a> du 27/11 prochain, elle va devoir être annulée si elle ne se remplit pas davantage d&#8217;ici mardi 20 !  N&#8217;oubliez pas que les sessions de 2012 font l&#8217;objet d&#8217;une promotion en ce moment :</p>

<ul>
<li>-20% sur <a href="http://www.git-attitude.fr/git-au-quotidien/">Git au Quotidien</a> le 20/11</li>
<li>-30% sur <a href="http://www.git-attitude.fr/git-avance/">Git Avancé</a> le 27/11</li>
</ul>


<p>Il vous suffit de préciser le code GITQLM dans votre demande de convention.  Profitez-en !</p>

<p>N&#8217;attendez pas ! Demandez rapidement vos conventions pour ces nouvelles dates !</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Git Attitude reprend la main, avec 3 sessions pour fin 2012 et de nombreuses ensuite]]></title>
    <link href="http://www.git-attitude.fr/2012/09/16/nouvelles-sessions-git-attitude/"/>
    <updated>2012-09-16T18:50:00+02:00</updated>
    <id>http://www.git-attitude.fr/2012/09/16/nouvelles-sessions-git-attitude</id>
    <content type="html"><![CDATA[<p>Après un premier semestre 2012 réalisé dans le cadre du Clever Institut, Git Attitude est désormais de nouveau proposé à 100% en direct par Delicious Insights.  Après une formation intra lourde en août, la transition vers du temps plein se poursuit et aboutira à la mi-novembre.</p>

<p>À partir de la semaine du 19/11/2012, les formations Attitude vont passer à la vitesse supérieure.  Dans la pratique, cela signifie :</p>

<ul>
<li>De nouveaux ateliers</li>
<li>(Beaucoup) plus de dates et un lieu de formation au top</li>
<li>Plus d&#8217;articles didactiques sur le site</li>
<li>Une nouvelle plate-forme intégrée pour présenter les formations, gérer les inscriptions, permettre les évaluations et commentaires, accéder aux ressources pédagogiques, demander des conventions de formation, etc.</li>
</ul>


<!-- more -->


<h2>De nouveaux ateliers</h2>

<p>Comme annoncé il y a quelques semaines sur Twitter, l&#8217;automne-hiver 2012 voit l&#8217;apparition d&#8217;un nouvel atelier au catalogue Git Attitude : <a href="http://www.git-attitude.fr/git-total/">Git Total</a>.</p>

<p>Décliné en versions 2 jours et 3 jours, il combine les ateliers classiques <a href="http://www.git-attitude.fr/git-au-quotidien/">Git au Quotidien</a> et <a href="http://www.git-attitude.fr/git-avance/">Git Avancé</a>.  Le format 3 jours donne davantage de temps aux exercices autonomes et à l&#8217;expérimentation personnelle, afin de renforcer l&#8217;assimilation immédiate des savoirs.</p>

<p>D&#8217;autres ateliers devraient ouvrir sur le premier semestre 2013, autour notamment de Github et, séparément, de l&#8217;hébergement privé de dépôts Git.  En attendant, nous vous invitons à regarder le détail des pages des ateliers pour découvrir les programmes détaillées, le lieu de formation, les tarifs et dates, etc.</p>

<h2>Nouveau planning, nouvel endroit !</h2>

<p>Historiquement, les sessions Attitude inter-entreprises se sont toujours tenues le samedi, presque exclusivement dans les locaux de Clever Age Paris, boulevard des Capucines, à deux pas d&#8217;Opera.  Nous tenons d&#8217;ailleurs à les remercier encore une fois chaleureusement pour ce <em>gentleman&#8217;s agreement</em> qui aura duré plus de 2 ans et sans lequel les formations Attitude n&#8217;auraient peut-être pas connu le succès qui est le leur aujourd&#8217;hui.</p>

<p>Toutefois, cette contrainte de planning (samedi seulement, une journée maximum) posait problème à de nombreux stagiaires potentiels, et limitait la gamme des ateliers proposables.</p>

<p><strong>Toutes les sessions seront en semaine dans notre nouveau lieu</strong>.  Jusqu&#8217;à nouvel ordre, elles se tiendront entre le mardi et le vendredi.</p>

<p>La barre latérale du site (ou sur mobile, le bas de page) listent à tout moment l&#8217;ensemble des dates prévues, avec le cas échéant un indicateur de places restantes (s&#8217;il en reste 4 ou moins).  À ce jour, les dates suivantes sont proposées :</p>

<ol>
<li><a href="http://www.git-attitude.fr/git-au-quotidien/">Git au Quotidien</a> mardi 20/11</li>
<li><a href="http://www.git-attitude.fr/js-puissant/">Git Avancé</a> mardi 27/11</li>
<li><a href="http://www.git-attitude.fr/git-total/">Git Total</a> (format 2 jours) mardi 04/12 et mercredi 05/12</li>
</ol>


<p>Aucune session n&#8217;est prévue sur la dernière semaine de décembre ; passez donc les fêtes avec proches, que diable !</p>

<p>Par ailleurs, à compter du 20/11/2012, nous serons également beaucoup plus disponibles pour des formations intra-entreprises et/ou sur-mesure.  Là aussi, la <em>sidebar</em> et une page dédiée vous informent et vous permettent de <a href="http://www.git-attitude.fr/demander-une-intra-ou-custom/">nous contacter sur ce sujet</a>.</p>

<p>Parlons à présent du nouvel endroit dans lequel auront lieu les formations Attitude.</p>

<p>Nous avons longuement cherché un endroit qui corresponde à nos exigences et à l&#8217;esprit des formations : décontracté, agréable et professionnel.  Nous avons donc été emballés en découvrant et visitant l&#8217;espace La Rochefoucauld du Groupe Formeret.</p>

<p>Le Groupe Formeret ne fait qu&#8217;une chose et le fait manifestement très bien : héberger des formations, séminaires, examens, etc.  Leurs 4 lieux sont impeccables, parfaitement accessibles à tous, conviviaux et lumineux.  À leur rencontre, on sent tout de suite leur volonté de bien faire et de fournir un service d&#8217;excellente qualité.  Nous espérons avoir trouvé en eux un partenaire de confiance sur la durée.</p>

<p>Nous avons choisi en priorité l’espace La Rochefoucauld en raison de sa situation géographique (Notre-Dame de Lorette / Saint-Georges, presque aussi central qu’Opéra) mais aussi du cachet du lieu (très calme, entouré de verdure, avec une vue imprenable sur le Sacré-Cœur) et de sa taille, qui permet d’éviter un effet « grands bureaux ».</p>

<p>La formation se déroule dans une salle privative <strong>climatisée, lumineuse, fonctionnelle et très confortable</strong>.  L’ensemble des locaux sont facilement accessibles en transports en commun et classés ERP, notamment accessibles aux Personnes à Mobilité Réduite.</p>

<p><em>Espace La Rochefoucauld<br/>
11 rue de La Rochefoucauld<br/>
75009 Paris</em></p>

<p><img class="center" src="http://www.git-attitude.fr/images/espace-la-rochefoucauld.jpg" width="789" height="127" title="Quelques vues de l’Espace La Rochefoucauld" ></p>

<p>Situé en plein cœur de Paris, tout près de la Gare Saint-Lazare et d&#8217;Opera, il est accessible <em>via</em> pas moins de 6 lignes de métro, 2 lignes de RER et 7 lignes de bus&nbsp;:</p>

<ul>
<li>Métro&nbsp;: Saint-Georges, Trinité (ligne 12), St-Lazare (lignes 3, 9, 12, 13 et 14), Chaussée d&#8217;Antin (lignes 7 et 9)</li>
<li>RER&nbsp;: Haussman Saint-Lazare (ligne E), Auber (ligne A)</li>
<li>Bus&nbsp;: Saint-Georges (67, 74), La Bruyere (74), Trinité (26, 32, 43, 68, 81)</li>
</ul>


<p>On trouve également nombre de parkings alentour.</p>

<iframe width="789" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://maps.google.fr/maps/ms?msa=0&amp;msid=217317377156117787165.0004c7b86726d25e19cd6&amp;ie=UTF8&amp;t=m&amp;ll=48.878102,2.334294&amp;spn=0.00247,0.008465&amp;z=17&amp;output=embed"></iframe>


<br /><small>Afficher <a href="https://maps.google.fr/maps/ms?msa=0&amp;msid=217317377156117787165.0004c7b86726d25e19cd6&amp;ie=UTF8&amp;t=m&amp;ll=48.878102,2.334294&amp;spn=0.00247,0.008465&amp;z=17&amp;source=embed" style="color:#0000FF;text-align:left">Espace la Rochefoucauld</a> sur une carte plus grande</small>


<p>Chaque stagiaire <strong>amène son propre poste de travail ou ordinateur portable</strong>.</p>

<p>L’accès internet est assuré par une connexion fibre très haut débit.  La salle fournit un accès Wi-Fi ainsi que des connexions RJ45 pour les postes qui le nécessiteraient.</p>

<div id="housing">
  <svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
     width="94.42px" height="100px" viewBox="0 0 94.42 100" enable-background="new 0 0 94.42 100" xml:space="preserve">
  <path d="M20.15,63.002c4.859-0.011,8.808-3.96,8.831-8.831c-0.023-4.875-3.972-8.824-8.831-8.832
    c-4.885,0.008-8.834,3.958-8.828,8.832C11.315,59.042,15.265,62.991,20.15,63.002L20.15,63.002z"/>
  <path d="M20.15,54.171"/>
  <path d="M29.576,56.229v7.639H16.034c-6.551,0.046-6.56,8.458,0,8.448h17.768c2.598,0.01,4.224-2.083,4.225-4.439V56.229
    C38.025,49.864,29.587,49.864,29.576,56.229L29.576,56.229z"/>
  <path d="M47.019,22.104"/>
  <path d="M47.019,22.104"/>
  <path d="M39.166,51.679H74.43c5.194-0.012,8.242,3.319,8.234,7.801v12.731H39.166V51.679L39.166,51.679z"/>
  <path d="M9.641,44.312c-0.01-6.947-9.648-6.947-9.641,0V100h9.858V85.645h74.973v14.247h9.589V56.88
    c0.025-7.328-9.719-7.328-9.696,0v17.171H9.641V44.312L9.641,44.312z"/>
  <path d="M47.019,0c-12.06,0.014-21.853,9.906-21.83,22.104c-0.023,12.204,9.77,22.092,21.83,22.101
    c12.098-0.009,21.894-9.897,21.886-22.101C68.912,9.906,59.116,0.014,47.019,0z M47.019,39.113
    c-9.276-0.008-16.81-7.618-16.792-17.009C30.209,12.718,37.743,5.109,47.019,5.09c9.314,0.019,16.85,7.628,16.848,17.014
    C63.868,31.495,56.333,39.105,47.019,39.113z"/>
  <path d="M44.744,29.901h4.93v-3.845c0.028-1.034,0.51-2.015,1.786-2.87c1.318-0.845,4.934-2.568,4.932-7.096
    c0.002-4.54-3.795-7.656-6.988-8.343c-3.193-0.635-6.653-0.2-9.099,2.491c-2.208,2.407-2.671,4.313-2.655,8.504h4.927v-0.975
    c-0.018-2.233,0.24-4.597,3.468-5.254c1.718-0.34,3.355,0.205,4.333,1.135c1.105,1.106,1.115,3.554-0.65,4.769l-2.763,1.897
    c-1.639,1.036-2.193,2.191-2.221,3.899V29.901L44.744,29.901z"/>
  <polygon points="44.744,36.891 44.744,31.854 49.728,31.854 49.728,36.891 44.744,36.891 "/>
  <path d="M47.236,34.399"/>
  </svg>

  <p>Vous n’êtes pas en région parisienne et cherchez un hébergement ?  Nous vous proposons de <a href="http://www.accorhotels.com/fr/booking/map-search.shtml?xml=world&xsl=cm&Lang=Fr&startCountry=FR&siteOrigine=ALL&Search=Adr&searchtext=11+rue+de+La+Rochefoucauld+75009+Paris" target="_blank">consulter les hôtels Accor à proximité</a> (Ibis, Mercure, Novotel, etc.) ou pourquoi pas de passer par <a href="https://www.airbnb.fr/s/11-Rue-de-la-Rochefoucauld--75009-Paris--France" target="_blank">airbnb</a> ?</p>
</div>


<h2>Plus d&#8217;articles didactiques</h2>

<p>Jusqu&#8217;à présent, le manque de temps ne nous a pas permis de maintenir pour le site Git Attitude l&#8217;envergure pédagogique et didactique que nous souhaitions.  Des dizaines de sujets d&#8217;articles et de didacticiels attendent depuis de nombreux mois d&#8217;être rédigés et publiés, et certains articles de référence (installation de Git, hébergément privé…) commencent à être obsolètes.  Les articles du site et la <em>timeline</em> Twitter se résumaient pour l&#8217;essentiel à des annonces d&#8217;atelier et du marketing, et étaient globalement en suspens pendant la période « Clever Institut ».</p>

<p>Si le marketing ne disparaîtra pas tout-à-coup du flux (pour le moment, Twitter et le bouche-à-oreille restent nos seuls canaux de communication et de marketing), les articles d&#8217;annonce, eux, n&#8217;auront plus cours : les pages détaillées des ateliers existent et contiendront toujours la liste des prochaines dates ; leurs URLs ne changeront pas.  Et la <em>sidebar</em> du site reprend ces informations.</p>

<p>En revanche, nous allons prendre de plus en plus de temps pour produire et publier des articles, didacticiels et suggestions de veille technologique, sur un rythme régulier et, nous l&#8217;espérons, assez fréquent.  Nous espérons qu&#8217;ainsi, vous trouverez le site toujours plus intéressant et utile.</p>

<h2>Bientôt une nouvelle plate-forme intégrée</h2>

<p>Il n&#8217;est plus possible pour le moment de vous inscrire directement en ligne, en payant par carte bancaire ou PayPal.  Nous travaillons à l&#8217;aboutissement d&#8217;un projet interne de plate-forme qui va regrouper l&#8217;ensemble des services en ligne dont les formations Attitude ont besoin : présentation, suivi des places disponibles, inscription ou demande de convention en ligne, attestations de présence, factures, évaluations par les stagiaires, accès aux ressources pédagogiques et forums de discussion entre les stagiaires passés et les formateurs, etc.</p>

<p>Les sites dédiés (<code>git-attitude.fr</code>, <code>js-attitude.fr</code>, etc.) se concentreront alors sur les contenus didactiques, et recroiseront diverses infos (dont le planning des sessions) avec la plate-forme.</p>

<p>En attendant, vous pouvez naturellement toujours nous faire une <a href="http://www.git-attitude.fr/demander-une-convention/">demande de convention</a> <em>via</em> le formulaire habituel.</p>

<h2>En résumé…</h2>

<p>Dès mi-novembre, Attitude passe la 5ème !  Nous espérons vous retrouver nombreux à nos sessions, et que le travail et la passion intenses que nous mettons dans la conception et la tenue de nos ateliers sauront vous séduire.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Un nouveau site Git Attitude]]></title>
    <link href="http://www.git-attitude.fr/2012/09/16/un-nouveau-site-git-attitude/"/>
    <updated>2012-09-16T18:39:00+02:00</updated>
    <id>http://www.git-attitude.fr/2012/09/16/un-nouveau-site-git-attitude</id>
    <content type="html"><![CDATA[<p>Après plus de <strong>2 ans</strong> d&#8217;existence, Git Attitude change de look et reprend son rôle principal, qui n&#8217;est juste de promouvoir les sessions de formation, mais aussi de <strong>transmettre</strong> et de <strong>partager</strong>.</p>

<!-- more -->


<p>Parce que nous anticipons des articles de plus en plus <strong>riche en codes sources</strong>, parce que nous souhaitons <strong>enrichir la discussion</strong> autour des commentaires et des réseaux sociaux, et parce que nous trouvons le look par défaut beaucoup plus propre que ce qu&#8217;on sur le site en place, nous avons passé Git Attitude sur <a href="http://www.octopress.org/">Octopress</a>.</p>

<p>Le catalogue est à l&#8217;honneur, au travers de la nouvelle page <a href="http://www.git-attitude.fr/tout-sur-les-ateliers/">Tout sur les ateliers</a> et des pages détaillées pour nos formations existantes (parfois remaniées).</p>

<p>Vous trouverez d&#8217;ailleurs une liste à jour des <strong>dates planifiées</strong> des ateliers Git Attitude dans la barre latérale (ou inférieure, sur des affichages étroits), ainsi qu&#8217;en bas de chaque page atelier du catalogue.  À partir de la mi-novembre 2012, vous aurez jusqu&#8217;à 4 jours de formation proposés par mois !</p>

<p>Nous espérons que le nouveau Git Attitude vous plaira.  Comme toujours, n&#8217;hésitez pas à échanger avec nous <em>via</em> les commentaires en bas de chaque page.  À très vite pour des articles et formations du tonnerre !</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Session Git au Quotidien à Paris le 07/06/2012]]></title>
    <link href="http://www.git-attitude.fr/2012/04/26/session-git-au-quotidien-a-paris-le-07-06-2012/"/>
    <updated>2012-04-26T00:00:00+02:00</updated>
    <id>http://www.git-attitude.fr/2012/04/26/session-git-au-quotidien-a-paris-le-07-06-2012</id>
    <content type="html"><![CDATA[<p>Toujours via le Clever Institut, <a href="http://clever-institut.com/achat/git-au-quotidien/211">une session Git au Quotidien est prévue le 07/06/2012</a>.</p>

<p>Sur la même période, j’assurerai par ailleurs en direct, et toujours le samedi pour le moment, les ateliers JS Attitude. Vous trouverez le détail et les dates dans les articles suivants :</p>

<ul>
<li><a href="http://js-attitude.fr/2012/03/27/js-puissant-nouvelle-date-le-12052012-a-paris/">JS Puissant le 12/05/2012 à Paris</a></li>
<li><a href="http://js-attitude.fr/2012/03/27/js-guru-nouvelle-date-le-30062012-a-paris/">JS Guru le 30/06/2012 à Paris</a></li>
</ul>


<p>Au plaisir de vous voir prochainement en atelier !</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Les sessions de formation Git de janvier à mars 2012 vous attendent !]]></title>
    <link href="http://www.git-attitude.fr/2011/11/21/les-sessions-de-formation-git-de-janvier-a-mars-2012-vous-attendent/"/>
    <updated>2011-11-21T00:00:00+01:00</updated>
    <id>http://www.git-attitude.fr/2011/11/21/les-sessions-de-formation-git-de-janvier-a-mars-2012-vous-attendent</id>
    <content type="html"><![CDATA[<p>Comme je l’avais annoncé à plusieurs reprises par le passé, à dater du 1er janvier 2012, j’assurerai les formations Git Attitude inter-entreprises au travers du nouvel organisme de formation de Clever Age : le <a href="https://clever-institut.com/">Clever Institut</a>.</p>

<p>Les éventuelles formations intra-entreprises restent assurées directement par Delicious Insights.</p>

<p>Nous avons tout récemment ancré les prochaines dates de session pour les deux types d’atelier. Il y en aura une par mois, <strong>en semaine</strong> (grosse nouveauté !), et nous augmenterons si besoin la fréquence à partir de mai ou juin 2012. Comme pour les sessions en direct, elles sont limitées à 10 places par atelier.</p>

<p>Dans l’immédiat, elles auront toutes lieu sur Paris. Vous pouvez vous inscrire dès maintenant sur les pages concernées :</p>

<ol>
<li><a href="https://clever-institut.com/achat/git-au-quotidien/123">Git au Quotidien le 14/02/2012</a> (originellement le 21/02)</li>
<li><a href="https://clever-institut.com/achat/git-avance/124">Git Avancé le 23/03/2012</a></li>
<li><a href="https://clever-institut.com/achat/git-au-quotidien/171">Git au Quotidien le 11/04/2012</a> (mise à jour)</li>
</ol>


<p>Les premières places partent déjà, je vous invite donc à lancer vos inscriptions le plus tôt possible.</p>

<p>Sur la même période, j’assurerai par ailleurs en direct, et toujours le samedi pour le moment, les ateliers JS Attitude. Vous trouverez le détail et les dates dans les articles suivants :</p>

<ul>
<li><a href="http://js-attitude.fr/2011/11/10/js-puissant-les-1401-et-31032012-a-paris/">JS Puissant les 14/01 et 31/03/2012 à Paris !</a></li>
<li><a href="http://js-attitude.fr/2011/11/10/js-guru-le-18022012-a-bordeaux-et-le-2104-a-paris/">JS Guru le 18/02/2012 à Bordeaux et le 21/04 à Paris !</a></li>
</ul>


<p>Au plaisir de vous voir prochainement en atelier !</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Git au Quotidien le 19/11 à Paris : il est temps de passer la 6ème !]]></title>
    <link href="http://www.git-attitude.fr/2011/09/24/git-au-quotidien-le-19-11-a-paris-il-est-temps-de-passer-la-6eme/"/>
    <updated>2011-09-24T00:00:00+02:00</updated>
    <id>http://www.git-attitude.fr/2011/09/24/git-au-quotidien-le-19-11-a-paris-il-est-temps-de-passer-la-6eme</id>
    <content type="html"><![CDATA[<h2>Git au Quotidien, qu&#8217;est-ce que c&#8217;est ?</h2>

<p>C&#8217;est <strong>une formation Git </strong>pas comme les autres****.</p>

<p>Vous trouverez <a href="http://www.git-attitude.fr/git-au-quotidien/">tous les détails de l&#8217;atelier sur la page Git au Quotidien</a> : programme, esprit, pré-requis technologiques, etc.</p>

<!-- more -->


<h2>Qui est le formateur ?</h2>

<p>L&#8217;atelier est assuré par Christophe Porteneuve (bonjour, c&#8217;est moi !).</p>

<p>Après plus de 15 ans à utiliser des gestionnaires de source divers, et pour finir quelques millions de lignes de code gérées avec Subversion, je me suis mis à Git en 2008 dans le cadre notamment de mes contributions à Rails, Prototype et script.aculo.us. Vers 2009, j&#8217;ai décidé d&#8217;y aller pour de bon et d&#8217;explorer en profondeur les tenants et aboutissants de cet outil, afin d&#8217;en tirer toute la puissance possible. En juin 2010, à force de discussions, je réalise qu&#8217;aucune formation Git n&#8217;existe apparemment en France (en tout cas aucune qui retienne l&#8217;attention…) et je lance Git Attitude.</p>

<p>Vous pouvez me retrouver sur <a href="http://twitter.com/porteneuve">Twitter</a>, <a href="http://fr.linkedin.com/in/christopheporteneuve">LinkedIn</a> et <a href="http://github.com/tdd">Github</a>.</p>

<p>J’ai par ailleurs plus de 6 000 heures de formation derrière moi, dont plus de la moitié dans le cadre de la formation professionnelle des adultes. J&#8217;adore transmettre, en fait, et les bouquins et conférences sont un prolongement de ça.</p>

<p>Vous vous ferez votre propre idée naturellement, mais ce qu’il faut retenir et que je peux vous garantir : je sais de quoi je parle quand je parle de Git, et je sais transmettre la connaissance.</p>

<p>Les ateliers Attitude se déroulent tous dans une atmosphère studieuse et experte, mais détendue et cordiale. On apprend, on s&#8217;émerveille parfois, on a des illuminations parfois, et on rigole souvent. Demandez donc aux stagiaires précédents (<em>via</em> Twitter avec le <em>hashtag</em> #gitattitude par exemple).</p>

<h2>Où, quand, comment, combien ?</h2>

<p>Ça se passe chez <strong>Clever Age Paris</strong> (le partenaire de longue date des ateliers Attitude), au <a href="http://maps.google.com/maps?client=safari&amp;rls=en&amp;q=37+bd+des+capucines+paris&amp;oe=UTF-8&amp;um=1&amp;ie=UTF-8&amp;hq=&amp;hnear=0x47e66e31658b8939:0xd1082d0559a56e1d,37+Boulevard+des+Capucines,+75002+Paris,+France&amp;ei=Lz58TqHyBoL_4QSs66XADg&amp;sa=X&amp;oi=geocode_result&amp;ct=title&amp;resnum=1&amp;ved=0CBoQ8gEwAA">37 bd des Capucines 75002 Paris</a>. C&#8217;est à deux pas d&#8217;Opera, super facile à rejoindre en transports en commun et depuis les principales gares parisiennes.</p>

<p>C&#8217;est <strong>samedi 19 novembre 2011, de 9h30 à 19h</strong>.</p>

<p>Chacun amène son portable avec une alimentation, et nous fournissons le reste (petit-déjeuner, déjeuner, boissons, café, Wi-Fi, etc.)</p>

<p>L&#8217;atelier coûte <strong>300€ HT</strong>, et fait naturellement l&#8217;objet d&#8217;une véritable <strong>facture</strong> par Delicious Insights, la société qui produit les ateliers Attitude. On peut <a href="https://attitude.stagehq.com/events/1013/booking/new">s&#8217;inscrire en ligne</a> et payer l&#8217;intégralité ou juste l&#8217;acompte de 30%, suivant son mode de fonctionnement. Ceux qui sont soumis à un process d&#8217;entreprise à l&#8217;ancienne peuvent s&#8217;inscrire hors-ligne et payer l’acompte par virement bancaire. Tous les détails sur <a href="http://www.git-attitude.fr/informations-generales/">les modalités de paiement sont dans les informations générales</a>.</p>

<p>Du coup, vous pouvez le financer un peu comme vous voulez :</p>

<ul>
<li>DIF</li>
<li>Crédit d&#8217;impôt au titre de la formation</li>
<li>Facture de prestation classique</li>
<li>…et prochainement OPCA (nous attendons notre numéro d&#8217;agrément formateur pour pouvoir le proposer)</li>
</ul>


<h3>C&#8217;est pas un peu cher, ça ?</h3>

<p>C&#8217;est sûr que ce n&#8217;est plus les 100€ de l&#8217;année de rodage, mais la fiscalité française des TPE-PME étant ce qu&#8217;elle est, pour être un tant soit peu rentables sur les ateliers, on doit répercuter les innombrables taxes et impôts sur le prix des prestations… Si ça a donc pas mal augmenté avec la rentrée 2011, ça reste <strong>plus de deux fois inférieur à la moyenne du marché</strong>, qui est aux alentours de 700€ HT. Et j&#8217;aurais tendance à dire qu&#8217;en plus, la formation est nettement meilleure, justement, que la moyenne du marché.</p>

<p>On essaie de rester aussi accessibles que possible dans ce nouveau contexte fiscal, mais on doit quand même essayer de gagner de l&#8217;argent. Voilà, vous savez tout !</p>

<h2>Super, je m&#8217;inscris !</h2>

<p>Vous avez mille fois raison :-) Pour la version en ligne immédiate et rapide, <a href="https://attitude.stagehq.com/events/1013/booking/new">c&#8217;est par ici</a>. Pour les modalités d&#8217;inscription hors-ligne, <a href="http://www.git-attitude.fr/wp-content/uploads/2011/09/Git-au-Quotidien.pdf">c&#8217;est par là</a>.</p>

<h2>Des questions ?</h2>

<p>N&#8217;hésitez pas à nous contacter, soit par commentaire sur cet article, soit par e-mail à inscriptions AT delicious TIRET insights POINT com.</p>

<p><strong>Inscrivez-vous rapidement, il n’y a que 10 places et la demande est forte pour cette prochaine session !</strong></p>

<p>Au plaisir de vous voir le 19 novembre prochain.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Les sessions Git Attitude pour la fin 2011 sont là !]]></title>
    <link href="http://www.git-attitude.fr/2011/09/10/les-sessions-git-attitude-pour-la-fin-2011-sont-la/"/>
    <updated>2011-09-10T00:00:00+02:00</updated>
    <id>http://www.git-attitude.fr/2011/09/10/les-sessions-git-attitude-pour-la-fin-2011-sont-la</id>
    <content type="html"><![CDATA[<p>C&#8217;est la rentrée ! Et avec elle, les formations Git Attitude reviennent… Mais quelque chose d&#8217;important a changé.</p>

<!-- more -->


<h2>Delicious Insights</h2>

<p>Les formations sont désormais dispensées dans un <strong>cadre formel et professionnel parfaitement défini</strong> : au travers de ma nouvelle société, <strong>Delicious Insights</strong>.</p>

<p>Évidemment, cela veut dire que, si nous avons décidé de rester <strong>abordables</strong>, la fiscalité invraisemblable des TPE et PME en France nous a toutefois contraint à abandonner le joli rêve des 100/150€. Les formations sont désormais à 300€ HT pour JS Puissant et 450€ HT pour JS Guru. Ça reste <strong>très inférieur aux tarifs moyens du marché</strong> (environ 700€ HT), sans parler de l&#8217;écart de qualité, que je vous laisse juger.</p>

<p>En revanche, cela signifie aussi que les <strong>financements</strong> de ces formations ne sont plus cantonnés aux notes de frais et cartes bancaires personnelles ! Puisque vous disposez désormais d&#8217;une facture tout ce qu&#8217;il y a de plus officiel, vous voilà à même d&#8217;utiliser <strong>les financements que vous souhaitez</strong> : prestation classique, DIF, crédit d&#8217;impôt et prochainement OPCA ! Ce qui rend les choses singulièrement plus simples pour la majorité de mes clients et prospects, qui sont des entreprises et non des particuliers.</p>

<h2>Où, quand, comment ?</h2>

<p>Dans les prochaines semaines, nous allons mettre en place le site de Delicious Insights et commencer à <strong>consolider l&#8217;ensemble de notre présence en ligne </strong>autour de la formation : Git Attitude, JS Attitude et Mon Attitude vont se rejoindre sur un nouveau serveur, homogénéiser un peu leurs identités visuelles avec celle de Delicious Insights, et bénéficier d&#8217;une <strong>plate-forme intégrée</strong> de proposition de sessions, consultation des dates, inscription, paiement, retour d&#8217;expérience et témoignage des stagiaires.</p>

<p><strong>Pour encore quelques semaines</strong>, le paiement en ligne reste traité <em>via</em> Stage et Paypal, mais ça va changer. Et le paiement hors-ligne par bon de commande et virement et d&#8217;ores et déjà accepté. En revanche, on ne prend pas les chèques.</p>

<p>Quant aux sessions proprement dites, elles vont se dérouler suivant les principes que voici :</p>

<ol>
<li><strong>Jusqu&#8217;au 31/12/2011</strong>, uniquement le samedi, en direct par Delicious Insights. Les 4 sessions sont déjà planifiées : une Git et 3 JS. Les dates et lieux sont plus bas dans cet article.</li>
<li><strong>À partir du 01/01/2012 et jusqu&#8217;au 31/03/2012 au minimum</strong>, les ateliers JS Attitude se tiendront toujours un samedi par mois, et les ateliers Git se tiendront environ un jour ouvré par mois, dans le cadre du Clever Institut, dont nous assurerons la partie Git du catalogue. Par ailleurs, le contenu des ateliers va progressivement être mis à disposition sous une forme alternative : des <em>screencasts</em> ciblés, de 30 à 60 minutes, proposés en ligne à un tarif attractif.</li>
<li><strong>Ensuite</strong>, il va se passer plusieurs choses :

<ul>
<li>des prestations <strong>intra-entreprises</strong> sur mesure vont devenir possibles,</li>
<li>Delicious Insights proposera <strong>jusqu&#8217;à 4 sessions par mois</strong> au lieu de 2,</li>
<li>un cursus de formations <strong>Ruby On Rails</strong> sera proposé (sessions de 2 à 3 jours, 3 à 5 sessions distinctes prévues),</li>
<li>l&#8217;offre <strong>JavaScript</strong> s&#8217;enrichira d&#8217;au moins <strong>quatre nouveaux ateliers</strong> sur les technologies de test automatisé, de documentation, NodeJS et CoffeeScript.</li>
</ul>
</li>
</ol>


<p>Comme vous pouvez le voir, 2012 va être une année exceptionnelle pour la formation Attitude !</p>

<p>Les ateliers continuent naturellement à intégrer petit-déjeuner et déjeuner dans leurs tarifs.</p>

<h2>Les fiches de formation et conditions générales</h2>

<p>Git Attitude, comme JS Attitude, est désormais doté d&#8217;<strong>onglets permanents</strong> pour ses ateliers, ainsi que d&#8217;un onglet Informations générales.</p>

<p>Les premiers proposent les fiches de formation détaillées, ainsi qu&#8217;un accès à une <strong>fiche PDF complète</strong> dotée des informations générales en sus et d&#8217;un bon de commande, pour ceux qui souhaiteraient ne pas payer en ligne.</p>

<p>Les informations générales, reprises dans chaque fichier PDF de fiche formation (sauf Git Avancé, assuré uniquement via Clever Institut pour le moment et donc sujet à leurs propres modalités), vous disent tout ce que vous voulez savoir sur les modalités d&#8217;inscription en ligne et hors-ligne, les conditions d&#8217;annulation et de remboursement, le règlement intérieur, etc. On fait ça au cordeau, en pleine conformité avec les sections concernées du Code du Travail et les décrets du Conseil d&#8217;État relatifs à la formation professionnelle continue.</p>

<h2>Les dates de l&#8217;automne 2011</h2>

<p>Voici les quatre dates de l&#8217;automne, toutes le samedi :</p>

<ol>
<li><a href="https://attitude.stagehq.com/events/1010/booking/new">24/09/2011</a> chez <strong>Comuto</strong> (des gens super sympa qui éditent <a href="http://www.covoiturage.fr/">Covoiturage</a>), à <strong>Paris</strong> 17e : <a href="http://js-attitude.fr/js-puissant/">JS Puissant</a></li>
<li><a href="https://attitude.stagehq.com/events/1011/booking/new">22/10/2011</a> chez Clever Age à <strong>Paris</strong> 2e : <a href="http://js-attitude.fr/js-guru/">JS Guru</a> (demandez à ceux du 03/07 combien la nouvelle formule est top !)</li>
<li><a href="https://attitude.stagehq.com/events/1013/booking/new">19/11/2011</a> chez Clever Age à <strong>Paris</strong> 2e : <a href="http://www.git-attitude.fr/git-au-quotidien/">Git au Quotidien</a></li>
<li><a href="https://attitude.stagehq.com/events/1012/booking/new">10/12/2011</a> chez Clever Age à <strong>Lyon</strong> : <a href="http://js-attitude.fr/js-guru/">JS Guru</a> (depuis le temps que les Lyonnais le réclament…)</li>
</ol>


<p>N&#8217;hésitez pas à poser toutes vos questions dans les commentaires.</p>

<p>Cette rentrée et 2012 s&#8217;annonce exceptionnelle pour notre activité de formation, et nous sommes impatients de voir comment se déroulent les ateliers déjà rodés et ce que donneront les nouveaux. Excellente année à vous tous !</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Git au Quotidien à Paris samedi 11/06/2011 !]]></title>
    <link href="http://www.git-attitude.fr/2011/04/03/git-au-quotidien-a-paris-samedi-11-06-2011/"/>
    <updated>2011-04-03T00:00:00+02:00</updated>
    <id>http://www.git-attitude.fr/2011/04/03/git-au-quotidien-a-paris-samedi-11-06-2011</id>
    <content type="html"><![CDATA[<p>Bonjour à tous,</p>

<p>À la <a href="http://mon-attitude.fr">demande générale</a>, <strong>le prochain atelier Git au Quotidien aura lieu samedi 11/06/2011 chez Clever Age Paris !</strong></p>

<p><a href="http://bit.ly/git-quotidien3">Il y a seulement 16 places, dépêchez-vous de vous inscrire !</a></p>

<p>Un Atelier Git Attitude, c&#8217;est l&#8217;occasion de <strong>booster immédiatement sa productivité avec Git, ou de découvrir ce merveilleux outil dans les meilleures conditions</strong>. En petit groupe, avec un formateur compétent et passionné, sur votre ordinateur portable, vous apprenez la philosophie, les commandes utiles, les bonnes pratiques, les astuces qui changent la vie, et les compétences qui sauvent la journée en cas de pépin ou de besoin complexe.</p>

<p>Les participants aux précédentes sessions sont <strong>enthousiastes</strong>, <a href="http://whygit.wufoo.com/reports/evaluation-des-ateliers-attitude/">comme en témoignent leurs évaluations</a>.</p>

<!-- more -->


<h2>Ça se passe où ?</h2>

<p><a href="http://www.clever-age.com"><img class="left" src="http://www.git-attitude.fr/images/logo-clever-age.png"></a></p>

<p>Nous serons à nouveau hébergés par les Gens Bien™ de <a href="http://www.clever-age.com/">Clever Age</a>, au 37, boulevard des Capucines 75002 Paris.</p>

<p><a href="http://maps.google.com/maps?f=q&amp;hl=fr&amp;geocode=&amp;time=&amp;date=&amp;ttype=&amp;q=37,+Boulevard+des+Capucines,+75002+2%C3%A8me+Arrondissement,+Paris,+France&amp;sll=37.0625,-95.677068&amp;sspn=33.626896,62.402344&amp;ie=UTF8&amp;ll=48.876909,2.333565&amp;spn=0.006817,0.015235&amp;z=13&amp;iwloc=addr&amp;om=1&amp;source=embed">Voir le plan</a></p>

<h2>La journée en un clin d’œil</h2>

<p>Cet atelier part de zéro (une connaissance d’un système de version usuel, type CVS ou Subversion, voire d’un autre DVCS type Bazaar, Fossil ou Mercurial, est clairement un plus, ne serait-ce que pour comprendre ce qu’on gagne…).</p>

<p>Dans cet atelier, vous apprendrez notamment toutes les meilleures façons de…</p>

<ul>
<li>configurer votre Git aux p’tits oignons</li>
<li>manipuler votre dépôt localement</li>
<li>faire des commits ajustés, parfois volontairement partiels, y compris sur des parties de fichier</li>
<li>gérer votre historique local de commits, en l’amendant si besoin</li>
<li>travailler avec des tas de branche et les fusionner facilement</li>
<li>gérer au mieux une urgence qui tombe en plein milieu d’un gros boulot sur le code</li>
<li>synchroniser avec des dépôts distants</li>
<li>et plus, bien plus encore !</li>
</ul>


<p>Le principe est d’aborder en profondeur toutes les commandes examinées ; la plupart des gens sous-utilisent atrocement des fondamentaux comme git add, git diff ou git log, ou encore ignorent tout des merveilles de git reset. Cet atelier donne d’entrée de jeu nombre de clés inestimables pour être redoutablement efficace dans sa gestion de sources au quotidien.</p>

<p>En plus de ça, vous avez droit à un <strong>petit-déjeuner</strong>, un <strong>déjeuner</strong> convivial dans un restaurant sympathique, du café (Nespresso !), du thé (équitable !) et des boissons fraîches à volonté…</p>

<p><strong>Tout ça pour seulement 75€ ! </strong>(en <em>early bird</em> ; 100€ en tarif plein)</p>

<p>Comme le disent des participants passés, c&#8217;est « tellement pas cher que je n&#8217;en reviens pas » !</p>

<p>Alors n&#8217;hésitez plus, et <a href="http://bit.ly/git-quotidien3">rejoignez-nous dès aujourd&#8217;hui pour cette session Git au Quotidien !</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Pourquoi tu devrais t'inscrire à un atelier Git Avancé]]></title>
    <link href="http://www.git-attitude.fr/2011/02/02/pourquoi-tu-devrais-t-inscrire-a-un-atelier-git-avance/"/>
    <updated>2011-02-02T00:00:00+01:00</updated>
    <id>http://www.git-attitude.fr/2011/02/02/pourquoi-tu-devrais-t-inscrire-a-un-atelier-git-avance</id>
    <content type="html"><![CDATA[<p>Alors que la demande existe bien pour Git Attitude, Quotidien comme Avancé, les inscriptions au premier atelier Git Avancé ne vont pas aussi vite que j&#8217;aurais pu le croire.</p>

<p>Il existe naturellement des demandeurs qui n&#8217;ont encore qu&#8217;une expérience très réduite (voire inexistante) de Git, et attendent du coup de pouvoir assister à un atelier Git au Quotidien pour ensuite faire leurs dents sur quelques projets avant de venir à Git Avancé.</p>

<p>Cependant, il existe <strong>aussi</strong> de nombreux « Git&#8217;ers » en France (pour ne pas dire en francophonie), qui ont une utilisation quotidienne équivalente, voire un peu au-delà, de ce premier niveau d&#8217;atelier.  Peut-être ne sont-ils pas très à l&#8217;aise avec git reset ; peut-être n&#8217;ont-ils jamais utilisé git add -p ni git rebase -i.  Mais cela ne les empêche pas d&#8217;être à l&#8217;aise avec les notions fondamentales de Git (<em>working tree</em>, <em>stage</em>, index), d&#8217;utiliser sans problème les syntaxes classiques de git add, git commit, git log, git push, git pull, git branch et git checkout.</p>

<p><strong>Et ce niveau simple de pratique de Git suffit amplement pour attaquer Git Avancé et en tirer le meilleur parti</strong></p>

<!-- more -->


<p>L&#8217;atelier Git Avancé est d&#8217;abord là pour <strong>approfondir</strong> les commandes fondamentales, notamment en explorant les plus utiles de leurs options méconnues (et il y en a de nombreuses qui recèlent de véritables trésors de productivité).  Rien que là, il est possible de réaliser un incoryable gain de temps dans ses tâches usuelles.</p>

<p>Au-delà de ça, l&#8217;objectif fondamental de l&#8217;atelier est de transmettre des meilleures pratiques adaptées à de nombreuses situations, parfois fréquentes, parfois plus rares mais bien épineuses…  Voici une petite liste, comme ça au débotté, des questions auxquelles cet atelier tente d&#8217;apporter une réponse :</p>

<ul>
<li>Comment <strong>factoriser</strong> une codebase entre plusieurs projets ? Vaut-il mieux utiliser des dépôts imbriqués ou des submodules ?</li>
<li><em><strong>merge</strong></em><strong> ou </strong><em><strong>rebase</strong></em> ?  Pourquoi ?  Dans quels cas ?</li>
<li>Si on est plusieurs à travailler sur un même dépôt, quels <strong>workflows</strong> sont les plus adaptés ? Combien de dépôts distants utiliser ?</li>
<li>Comment bien gérer la mise à jour des <strong>submodules</strong> et leur propagation raisonnée ?</li>
<li>Comment je fais pour retomber sur mes pattes après que l’autre andouille ait <strong>cassé l&#8217;historique distant</strong> ?</li>
<li><strong>J’aurais dû faire une branche</strong> plus tôt…  Comment je récupère le coup ?</li>
<li>J&#8217;ai <strong>committé par mégarde</strong> des fichiers confidentiels ou sensibles : je peux en <strong>effacer toutes les traces</strong>, historique compris ?</li>
<li>Comment fusionner un commit seul, <strong>sans se farcir pour autant son historique</strong> ?</li>
<li>Comment déterminer quels commits ont <strong>déjà été fusionnés</strong> d&#8217;une branche A dans une branche B ?</li>
<li>Tags, branches… master/develop/production…  Qu’est-ce qui marche comme organisations ?</li>
<li>J’ai <strong>paumé un commit</strong> en jouant trop avec git reset ! Comment le retrouver ?</li>
<li>Comment exécuter des tâches <strong>automatiquement</strong> à chaque commit ou à chaque push ?</li>
<li>Je viens de faire une résolution manuelle de fusion bien galère…  Comment <strong>éviter à mes collègues de se galérer</strong> pareil s’ils fusionnent la même branche ?</li>
<li>Je viens de repérer un bug qui ne date pas d&#8217;hier mais n’était pas là y&#8217;a un mois…  Comment trouver quel commit l&#8217;a introduit ?</li>
<li>J’en ai ras le c… de l’éditeur pourri de Jean-Kevin qui me fout des TAB et laisse plein d&#8217;espaces en fin de ligne…  Est-ce qu&#8217;on pourrait pas <strong>nettoyer tout ça automatiquement</strong> chaque fois qu&#8217;un fichier texte est committé ?</li>
<li>J’ai plein de taf en cours dans le WT qui m’empêche de faire un <em>pull</em>, mais c&#8217;est trop <strong>pas prêt </strong>à être committé ! Qu’est-ce que je peux faire ?</li>
</ul>


<p>Bref, Git ça torche, il est temps d&#8217;arrêter de s&#8217;en servir à peine mieux que si c&#8217;était Subversion.</p>

<p>Alors n&#8217;hésitez plus et <a href="http://bit.ly/git-avance-fev11">courrez vous inscrire pour le 19 février</a>.  C&#8217;est dans même pas 3 semaines !</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[1er atelier Git Avancé samedi 19/02/2011 à Paris !]]></title>
    <link href="http://www.git-attitude.fr/2010/11/02/1er-atelier-git-avance-samedi-19-02-2011-a-paris/"/>
    <updated>2010-11-02T00:00:00+01:00</updated>
    <id>http://www.git-attitude.fr/2010/11/02/1er-atelier-git-avance-samedi-19-02-2011-a-paris</id>
    <content type="html"><![CDATA[<p>Bonjour à tous,</p>

<p><strong>L</strong><strong>a première session Git Avancé aura lieu samedi 19 février 2011 chez Clever Age, à Paris, de 9h30 à 19h30</strong>.</p>

<p><a href="http://bit.ly/git-avance-fev11">Il y a seulement 16 places, dépêchez-vous de vous inscrire !</a></p>

<p>Un Atelier Git Attitude, c&#8217;est l&#8217;occasion de <strong>booster immédiatement sa productivité avec Git, ou de découvrir ce merveilleux outil dans les meilleures conditions</strong>. En petit groupe, avec un formateur compétent et passionné, sur votre ordinateur portable, vous apprenez la philosophie, les commandes utiles, les bonnes pratiques, les astuces qui changent la vie, et les compétences qui sauvent la journée en cas de pépin ou de besoin complexe.</p>

<p>Les participants aux précédentes sessions sont <strong>enthousiastes</strong>, <a href="http://whygit.wufoo.com/reports/evaluation-des-ateliers-git/">comme en témoignent leurs évaluations</a>.</p>

<!-- more -->


<h2>Ça se passe où ?</h2>

<p><a href="http://www.clever-age.com"><img class="left" src="http://www.git-attitude.fr/images/logo-clever-age.png"></a></p>

<p>Nous serons à nouvceau hébergés par les Gens Bien™ de <a href="http://www.clever-age.com/">Clever Age</a>, au 37, boulevard des Capucines 75002 Paris.</p>

<p><a href="http://maps.google.com/maps?f=q&amp;hl=fr&amp;geocode=&amp;time=&amp;date=&amp;ttype=&amp;q=37,+Boulevard+des+Capucines,+75002+2%C3%A8me+Arrondissement,+Paris,+France&amp;sll=37.0625,-95.677068&amp;sspn=33.626896,62.402344&amp;ie=UTF8&amp;ll=48.876909,2.333565&amp;spn=0.006817,0.015235&amp;z=13&amp;iwloc=addr&amp;om=1&amp;source=embed">Voir le plan</a></p>

<h2>La journée en un clin d’œil</h2>

<p>Cet atelier s&#8217;adresse aux personnes déjà bien rompues à Git (d&#8217;un niveau similaire à celui, déjà pas mal du tout, procuré par notre session Git au Quotidien), et qui souhaitent pousser plus loin. Voici un aperçu des sujets qui seront triturés dans tous les sens :</p>

<ul>
<li>Tout sur les <strong>submodules</strong> : les ajouter, les modifier, les mettre à jour, éviter les pièges et erreurs usuelles…</li>
<li>Pas mal de choses sur le <strong>boulot à plusieurs</strong> : gérer des dépôts distants multiples, tirer parti du rebase, etc.</li>
<li><strong>Partager une résolution manuelle de conflits</strong> avec git rerere</li>
<li><strong>Traquer automatiquement la source historique</strong> d’un bug avec git bisect</li>
<li><strong>Récupérer un commit éjecté</strong> de l’historique avec git reflog</li>
<li>Peaufiner les comportements de Git avec les <strong>Attributs</strong></li>
<li>Utiliser les <strong>hooks</strong> pour automatiser des traitements</li>
<li>Annoter les commits avec <strong>git notes</strong></li>
<li>…</li>
</ul>


<p>En plus de ça, vous avez droit à un <strong>petit-déjeuner</strong>, un <strong>déjeuner</strong> convivial dans un restaurant sympathique, du café (Nespresso !), du thé (équitable !) et des boissons fraîches à volonté…</p>

<p><strong>Tout ça pour seulement 100€ ! </strong>(en <em>early bird</em> ; 150€ en tarif plein)</p>

<p>Comme le disent des participants passés, c&#8217;est « tellement pas cher que je n&#8217;en reviens pas » !</p>

<p>Alors n&#8217;hésitez plus, et <a href="http://bit.ly/git-avance-fev11">rejoignez-nous dès aujourd&#8217;hui pour la première session Git Avancé !</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Votez pour vos ateliers Git Attitude… et JS Attitude !]]></title>
    <link href="http://www.git-attitude.fr/2010/10/17/votez-pour-vos-ateliers-git-attitude-et-js-attitude/"/>
    <updated>2010-10-17T00:00:00+02:00</updated>
    <id>http://www.git-attitude.fr/2010/10/17/votez-pour-vos-ateliers-git-attitude-et-js-attitude</id>
    <content type="html"><![CDATA[<p>Je détaillais il y a quelques jours <a href="http://www.git-attitude.fr/2010/09/30/git-attitude-ici-ailleurs-et-plus-avant/">les 4 niveaux d&#8217;Atelier Git Attitude</a> que je pensais mettre en œuvre, et lançais des filets pour des ateliers hors de Paris. Jusqu&#8217;ici, on a connu 2 sessions de l&#8217;atelier Git au Quotidien (le 18/07 et le 10/09 dernier, chez Clever Age Paris), qui se sont <a href="http://bit.ly/i-loved-aga">très bien passées</a>.</p>

<p>Dans les couloirs de l&#8217;édition 2010 de Paris-Web, on m&#8217;a proposé des locaux d&#8217;accueil pour les ateliers à <strong>Nantes</strong>, <strong>Bordeaux</strong>, <strong>Lyon</strong>, <strong>Strasbourg</strong> et <strong>Nîmes</strong>. Voilà de quoi bien couvrir l&#8217;hexagone ! <em>Git Attitude Corp.</em> n&#8217;est pas loin…</p>

<p>Toujours dans ces fameux couloirs, une belle idée s&#8217;est fait jour : il faut lancer les <strong>Ateliers JS Attitude</strong>. En effet, voilà un autre domaine où des formations de qualité font cruellement défaut, notamment en francophonie, et où je me trouve être expert (reconnu, en plus !)</p>

<p>Je suis donc en train de mettre sur pied <a href="http://js-attitude.fr">js-attitude.fr</a> (patience, ça arrive, c&#8217;est pas encore là du tout…) et j&#8217;ai déjà la structuration des ateliers en tête. Comme le domaine dédié n&#8217;est pas encore équipé-avec-toutes-les-options, je les annonce ici :</p>

<ul>
<li><strong>Niveau 1 : JS Solide</strong>. S&#8217;adresse à pratiquement tout le monde sauf les gens déjà capables, par exemple, de contribuer utilement à un framework établi. Si tu es fort en jQuery, tu n&#8217;es pas fort en JS pour autant, par exemple. Au menu, entre autres : <em>module pattern</em>, méthodes méconnues des types natifs (notamment Number), pièges classiques, ES4 vs. ES5 vs. Harmony, accès DOM, tâches fréquentes, savoir trouver et utiliser les bonnes docs, meilleures pratiques diverses…</li>
<li><strong>Niveau 2 : JS Avancé</strong>. Niveau 1 indispensable. On entre dans beaucoup de détails techniques, d&#8217;optimisation et de performances, d&#8217;outils de concaténation/minification/structuration (Sprockets, YUI Compressor, Clojure…), de tâches complexes, de sécurité, et bien entendu on parle des principaux frameworks, sur desktop et mobile.</li>
<li><strong>JS en Vrai</strong>. Même principe de travail sur études de cas réelles, issues des projets des participants, que pour les ateliers Git en Vrai.</li>
<li><strong>JS Côté Serveur</strong>. JavaScript domine le monde ! :-) Et JS côté serveur, avec notamment Node.js (basé sur V8) mais aussi Rhino, Squirrelfish Extreme et la JSC d&#8217;OSX, et plein d&#8217;autres choses, nous permettent d&#8217;utiliser cet extraordinaire langage côté serveur, ou simplement hors du navigateur (pour tester un bout de code vite fait). Il y a plein de belles choses à faire !</li>
<li><strong>JS Blindé</strong>. JavaScript n&#8217;est PAS un langage jouet, loin s&#8217;en faut, et à ce titre rien ne justifie qu&#8217;on soit plus laxiste en développant du JS qu&#8217;en développant autre chose. Heureusement, il existe d&#8217;excellents outils de tests (unitaires, fonctionnels et d&#8217;intégration) et de doc, qui nous permettent de fournir à notre code JS une couverture de tests et une doc d&#8217;API digne des meilleures <em>codebases</em>. Cet atelier se penche sur QUnit, JSUnit, Evidence, JsDoc, PDoc et d&#8217;autres outils du même genre pour fournir des réponses concrètes sur ces sujets importants.</li>
</ul>


<p>Ce qui est important, c&#8217;est que j&#8217;ai mis en place un Doodle où <strong><a href="http://www.doodle.com/hfq79x7z23zh7nvq">vous pouvez indiquer votre intérêt</a></strong> pour les divers ateliers Git Attitude et JS Attitude, ainsi que pour les lieux déjà prévus. Je vous demande deux choses quand vous y participez.</p>

<ul>
<li>Primo, indiquez votre e-mail ou au moins votre Twitter ID, histoire qu&#8217;on puisse <em>facilement vous recontacter</em>.</li>
<li>Secundo, n&#8217;indiquez votre intérêt que s&#8217;il est « réel », c&#8217;est-à-dire si vous seriez effectivement prêt(e) à <em>payer votre place</em> pour un tel atelier (les tarifs allant de 100€ à 300€ pour la journée, suivant que c&#8217;est à Paris ou en Province, et plus ou moins avancé ou complexe à préparer). Je ne vous forcerai naturellement jamais la main, mais cela me permet d&#8217;avoir des « prévisions » plus fiables et de ne pas me retrouver le bec dans l&#8217;eau, à ne même pas rentrer dans mes frais…</li>
</ul>


<p>Et naturellement, vous avez les commentaires, comme toujours, pour participer plus avant. Et Twitter, en mention, retweet, etc. pour colporter la bonne nouvelle et échanger « en live » avec <a href="http://twitter.com/gitattitude">@gitattitude</a> et <a href="http://twitter.com/jsattitude">@jsattitude</a> !</p>

<p>J&#8217;ai hâte de lire vos retours.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Un peu en retrait…]]></title>
    <link href="http://www.git-attitude.fr/2010/09/30/un-peu-en-retrait/"/>
    <updated>2010-09-30T00:00:00+02:00</updated>
    <id>http://www.git-attitude.fr/2010/09/30/un-peu-en-retrait</id>
    <content type="html"><![CDATA[<p>Eh oui, voilà déjà quelques semaines que ce blog n&#8217;a pas connu de nouveau super billet didactique, malgré une liste d&#8217;attente bien garnie !</p>

<p>Ça vient, ça vient, seulement voilà : d&#8217;une part, ce mois-ci j&#8217;ai fait un peu de boulot <em>freelance</em> pour compenser le coût de mon passage à JSConf.eu, et d&#8217;autre part, je donne deux ateliers très chronophages à Paris-Web 2010, qui se tiendra dans… 2 semaines !</p>

<p>Donc, le peu de temps perso que j&#8217;ai, je le passe là-dessus. Pour le moment. Promis, à partir du 18/10, je remets le focus sur Git Attitude.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Git Attitude ici, ailleurs, et plus avant]]></title>
    <link href="http://www.git-attitude.fr/2010/09/30/git-attitude-ici-ailleurs-et-plus-avant/"/>
    <updated>2010-09-30T00:00:00+02:00</updated>
    <id>http://www.git-attitude.fr/2010/09/30/git-attitude-ici-ailleurs-et-plus-avant</id>
    <content type="html"><![CDATA[<p>Pour le moment, les ateliers Git Attitude se tiennent en français, à Paris, et sur un programme très riche mais accessible aux débutants, que j&#8217;appelle l&#8217;atelier &#8220;Git au quotidien&#8221;.</p>

<p>En vertu de quoi, la matinée, et le début de l&#8217;après-midi, reprennent les bases en détail (en y entrelaçant des usages bien avancés quand même, genre <code>git add -p</code>).</p>

<p>Seulement voilà, il y a beaucoup plus à faire ! J&#8217;ai entre autres envie de monter les ateliers suivants :</p>

<ul>
<li><strong>Git Avancé</strong> : les submodules, rerere, bisect, reflog et ses amis, notes, les attributs Git, les remotes multiples, etc.</li>
<li><strong>Git En Vrai</strong> : toute la journée passée à résoudre des études de cas concrètes, issues des projets des participants (envoyés à l&#8217;avance pour validation et recherche d&#8217;optimalité)</li>
<li><strong>Git Chez Soi</strong> : tout sur l&#8217;hébergement et l&#8217;administration (gitosis, git-daemon, gitweb, GitHub avancé, hooks et plugins d&#8217;interfaçage, etc.)</li>
</ul>


<p>Par ailleurs, j&#8217;ai envie de permettre aux développeurs non parisiens, et même non francophones, d&#8217;accéder à tous les ateliers. Pour cela, deux voies :</p>

<ul>
<li>Ouvrir des sessions en anglais (des francophones à l&#8217;aise en anglais peuvent naturellement s&#8217;inscrire) ; je peux les assurer sans souci.</li>
<li>Ouvrir des sessions hors de Paris ; ce deuxième point nécessite toutefois un coût d&#8217;entrée un peu plus élevé, car j&#8217;ai des frais supplémentaires (transport et hébergement). L&#8217;idée est de trouver une ville susceptible de rassembler une session &#8220;pleine&#8221; (au moins 10 personnes payantes), et une gentille structure capable de nous héberger pour la journée, moyennant une ou deux places gratuites et la pub que je lui fais lors des annonces, etc. Dans cet esprit, on m&#8217;a déjà ouvert les bras à Lyon. Qui serait partant pour un atelier à Lyon ?</li>
</ul>


<p>Pour  le moment, je réfléchis à tout ça. Si ça décolle, il faudra que je mette en ligne un système de pré-inscription histoire de voir quand on atteint une masse critique justifiant la mise en œuvre de tel type d&#8217;atelier dans telle ville… Mais ça peut se faire, il suffit d&#8217;un peu de bonne volonté de la part de tous.</p>

<p>J&#8217;attends <strong>impatiemment</strong> vos commentaires, suggestions, retours, etc. sur les types d&#8217;ateliers que je décris, et sur Git Attitude hors de Paris ! Le blog est là pour ça, allez-y ! <em>(commentaires modérés, mais je fais vite)</em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Git + Subversion : arrêtez d''ignorer ce que vous devriez ignorer (?!)]]></title>
    <link href="http://www.git-attitude.fr/2010/09/16/git-subversion-arretez-d-ignorer-ce-que-vous-devriez-ignorer/"/>
    <updated>2010-09-16T00:00:00+02:00</updated>
    <id>http://www.git-attitude.fr/2010/09/16/git-subversion-arretez-d-ignorer-ce-que-vous-devriez-ignorer</id>
    <content type="html"><![CDATA[<p>Parfois on se retrouve à faire du Git, en local, sur un dépôt distant Subversion. Ça arrive en fait dans deux situations :</p>

<ul>
<li>On est en train de <strong>passer un dépôt de Subversion vers Git</strong>, en vue d&#8217;abandonner le premier au profit du second (yay !).</li>
<li>On est obligé de <strong>bosser sur un dépôt Subversion</strong>, mais on refuse de laisser tomber le confort quotidien de Git en local.</li>
</ul>


<p>Git propose une passerelle au moyen de la commande git svn et de ses sous-commandes. Moyennant quelques précautions d&#8217;usage, on peut ainsi travailler avec Git en local et synchroniser vers (et depuis) le dépôt Subversion distant. C&#8217;est un sujet assez vaste et j&#8217;y reviendrai plus en détail dans un prochain billet.</p>

<p>Toutefois, ceux qui rencontrent déjà ces situations ont sans doute remarqué un phénomène irritant : <strong>Git ne prend pas en compte la propriété svn:ignore</strong>. En fait, il ne prend en compte que svn:executable (ce qui est déjà pas mal, vu comme elle est grave utile…).</p>

<!-- more -->


<p>La propriété <code>svn:ignore</code> est similaire au fichier <code>.gitignore</code> : elle permet de lister des motifs de fichiers qui ne doivent pas être versionnés. Il est donc dommage qu&#8217;on n&#8217;en bénéficie pas automatiquement sur Git, risquant ainsi de versionner par erreur des fichiers qui devraient être ignorés.</p>

<p>Voilà pourquoi j&#8217;ai développé un petit outil qui va <strong>automatiquement synchroniser vos svn:ignore vers vos .gitignore</strong>, à tout moment, pour votre <code>master</code> (c&#8217;est-à-dire votre trunk distant), sans écraser d&#8217;éventuelles infos déjà présentes dans vos <code>.gitignore</code>… C&#8217;est le premier d&#8217;une série probable de petits scripts du même genre, destinés à faciliter l&#8217;utilisation de Git au quotidien.</p>

<p>Comme mon récent outil <a href="http://github.com/tdd/git-basecamp">git-basecamp</a>, il est disponible en open-source, et documenté, sur GitHub. Je vous invite donc à jeter un œil à mon dépôt <a href="http://github.com/tdd/git-helpers">git-helpers</a>. Notez qu&#8217;il existe aussi une quantité de dépôts nommés « git-tools » sur Github, mais aucun de ceux que j&#8217;ai regardés n&#8217;avait cette fonctionnalité (et la plupart des aides qu&#8217;ils fournissent m&#8217;ont semblé un peu basiques…).</p>

<p>Enjoy !</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Le concours c'est fini, et personne n'est vraiment perdant !]]></title>
    <link href="http://www.git-attitude.fr/2010/09/13/le-concours-c-est-fini-et-personne-n-est-vraiment-perdant/"/>
    <updated>2010-09-13T00:00:00+02:00</updated>
    <id>http://www.git-attitude.fr/2010/09/13/le-concours-c-est-fini-et-personne-n-est-vraiment-perdant</id>
    <content type="html"><![CDATA[<p>Le <a href="http://www.git-attitude.fr/2010/09/06/gagnez-une-place-pour-le-prochain-atelier-git-attitude/">concours</a> lancé il y a une semaine est terminé, mais hélas pas de gagnant, faute d&#8217;inscription dans les temps…</p>

<p>Comme je suis sympa, <strong>tous ceux qui ont participé recevront par DM Twitter</strong> (pourvu qu&#8217;ils suivent @gitattitude…) un code de <strong>réduction -20%</strong> à utiliser le plus vite possible, car l&#8217;atelier, <strong>c&#8217;est samedi !</strong></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Comprendre et maîtriser les clés SSH]]></title>
    <link href="http://www.git-attitude.fr/2010/09/13/comprendre-et-maitriser-les-cles-ssh/"/>
    <updated>2010-09-13T00:00:00+02:00</updated>
    <id>http://www.git-attitude.fr/2010/09/13/comprendre-et-maitriser-les-cles-ssh</id>
    <content type="html"><![CDATA[<p>Git base toute sa gestion d’authentification sur le mécanisme des <strong>clés SSH</strong>.  Ce système est d’ailleurs immensément utile de façon générale sous Linux, Unix et OSX, dès qu’il s’agit de s’authentifier sur une machine tierce.  Afin d’avoir un maximum de confort lorsqu’on accède à un dépôt nécessitant une identification (lecture de dépôts privés ou écriture dans le cas général), il est donc important de bien maîtriser les clés SSH.</p>

<p>Ce billet tente de vous donner toutes les clés (ahem) pour comprendre et manipuler aisément vos identités SSH.</p>

<!-- more -->


<p>Après un topo rapide sur le principe des clés asymétriques, nous verrons rapidement quels algorithmes sont à favoriser, quelles tailles de clé sont acceptables, et les meilleures pratiques de <em>protection</em> de vos clés (tant en termes de <em>passphrase</em> que de gestion des droits d’accès à vos fichiers de clés).</p>

<p>Ces fondamentaux étant assimilés, nous pourrons vérifier si vous avez déjà des clés, comment en créer de nouvelles, et comment vous en servir efficacement et confortablement pour vos accès à des dépôts Git.</p>

<h2>Principe des clés asymétriques</h2>

<p>Quand vous travaillez avec des clés asymétriques, par principe, vous avez deux clés (on parle de <strong>paire</strong> de clés) : une <strong>clé publique</strong>, que vous pouvez diffuser librement, voire mettre à disposition sur un serveur de clés ; et une <strong>clé privée</strong>, qui constitue véritablement votre « identité », et ne doit jamais être diffusée : elle reste simplement présente dans votre dépôt de clés personnel.</p>

<p>Comme toujours en cryptographie, on peut faire deux choses avec une clé : <em>chiffrer</em> un contenu (l’encrypter) ou le <em>signer</em> (calculer une valeur unique, reposant sur le contenu concerné et sur votre clé privée, pour obtenir une valeur de signature, comme un cachet spécifique).  Seule la clé « d’en face » (la publique si vous avez utilisé la privée, et inversement) permet de déchiffrer ou de vérifier la signature.  Notez au passage que signer un contenu permet non seulement d’attester que vous êtes bien l’envoyeur (ou l’auteur, etc.), mais aussi que le contenu n’a pas été modifié après signature.</p>

<p>Une paire de clé permet donc de vous représenter vis-à-vis d’un système tiers, en lui fournissant à l’avance votre clé publique, pour ensuite communiquer avec lui à l’aide de votre clé privée ; puisque seules les clés d’une même paire peuvent se comprendre, le système distant est à même non seulement de vérifier que vous êtes bien celui (ou celle) que vous prétendez être, mais aussi que ce qu’il reçoit est bien ce que vous envoyé.  Pas mal !</p>

<p>Si le sujet vous intéresse, vous trouverez une <a href="http://fr.wikipedia.org/wiki/Cryptographie_asymétrique">tonne d’infos sur Wikipedia</a>.  Mais si j’étais vous, je finirais cet article d’abord histoire de ne pas partir sur une tangente…</p>

<h2>RSA vs. DSA</h2>

<p>Il existe de nombreux algorithmes de chiffrement basés sur des clés asymétriques, mais les deux dominants, et de loin, son RSA et DSA, d’après les initiales de leurs auteurs respectifs.  RSA est historiquement le premier, et DSA a été développé plus récemment, comme une alternative alors qu&#8217;RSA était encore breveté.</p>

<p>De nombreux didacticiels, articles et documentations exploitent RSA, mais vous pouvez choisir librement RSA ou DSA pour vos clés, du moment que vous utilisez une taille suffisante (voir ci-après).</p>

<h2>Taille de clé</h2>

<p>Une clé a une taille, exprimée en nombre de bits.  Par exemple, les clés exploitées par les certificats de chiffrement des sites web utilisant la protection SSL (vous savez, ces URLs qui démarrent en <code>https://</code>, par exemple votre gestion de compte bancaire en ligne) sont généralement limitées, pour des raisons légales d’origine honteuse, à 256 bits.  En revanche, vos propres clés ne font pas (ou plus, suivant le pays où vous vivez) l’objet d’une telle limitation.</p>

<p>À ce jour, une taille de 2Ko, c’est-à-dire 2048 bits (oui, 8 fois plus qu’un certificat bancaire !) est considérée raisonnablement sécurisée pour RSA, en tout cas pour un particulier.  En gros, même si la toute-puissante NSA avait envie de casser votre chiffrage pour jeter un œil à ces données, il leur faudrait quelques heures pour y parvenir.  Et pour qu’ils daignent vous allouer quelques heures de leur système, vous devez en gros être un très, très gros poisson.</p>

<p>Donc on est tranquilles.</p>

<p>Notez qu’en revanche une clé DSA fait obligatoirement 1024 bits (1Ko).  C’est comme ça.</p>

<h2>Passphrase</h2>

<p>Vous avez certainement l’habitude voir le terme <em>password</em>, c’est-à-dire mot de passe.  Et vous avez sûrement déjà rencontré des tas de systèmes, services et outils qui vous demandent de saisir un mot de passe, en lui imposant une taille minimum (ce qui est bien) et maximum (ce qui est parfaitement stupide et contre-productif).  À cause de ce maximum, justement, ces systèmes insistent pour que vous mélangiez à loisir majuscules, minuscules, chiffres et symboles, et n’utilisiez pas de termes trop évidents (dates de naissances, prénoms, noms de vos animaux, mots basiques, segments de touches du clavier, etc.).</p>

<p>Du coup, tout le monde se retrouve forcé d’utiliser des mots de passe genre <code>&amp;dF@8^Xy+</code>, qui sont tellement tordus qu’on s’empresse de les noter sur un papier, massacrant instantanément l’utilité du mot de passe en le rendant facile à découvrir en cas de besoin (surtout quand ledit papier est un Post-It™ collé sous le clavier, voire sur l’écran) (ne rigolez pas, je l’ai déjà vu) (plusieurs fois) (en fait, si ça se trouve, <em>vous</em> l’avez déjà fait) (gredin(e) que vous êtes).</p>

<p>Par contraste, une <em>passphrase</em> (pas d’équivalent français satisfaisant à ma connaissance, aussi essayez de le prononcer correctement, genre <em>passfrayz</em>) est une petite phrase, ou tout au moins un morceau de phrase, donc plusieurs mots.  Et je dis bien mots, parce qu’en l’occurrence, utiliser de vrais mots et noms ne pose plus guère de problème, dès lors qu’on en a au moins 3 ou 4, surtout s’ils n’ont aucun rapport.</p>

<p>« Mais on m’a toujours dit que des vrais mots Saymal™ ! », me hurlez-vous avec consternation, le sourcil vengeur.</p>

<p>Oui, sauf dans des jolies passphrases.  Pourquoi donc ? Parce que le niveau de complexité augmente de façon plus qu’exponentielle au fil des caractères, en particulier quand on commence à découper en mots.  En cryptographie, on considère qu’un mot de passe, ou une passphrase, peuvent appartenir à plusieurs niveaux de sécurité, qui correspondent à la difficulté qu’on rencontre pour les casser.  La recherche sur le sujet abonde et se met à jour chaque année, notamment au sein de conférences spécialisées comme la célèbre DEFCON.</p>

<p>Je suis assez fan de <a href="http://www.baekdal.com/tips/password-security-usability">cet excellent article</a> de Thomas Baekdal, qui illustre bien le sujet.  Imaginons une passphrase qu’il faudrait des centaines d’années, voire des millénaires, dans l’état actuel de la technologie la plus avancée, pour casser par un moyen technologique.  On qualifie une telle passphrase de « sécurisée à vie » (<em>secure for life</em>).  Eh bien, pour obtenir une telle passphrase, il suffit de combiner au moins 3 mots, pas nécessairement sans rapport, pour un total d’au moins une dizaine de caractères.  Voici quelques exemples de telles passphrases :</p>

<ul>
<li>this is fun (sérieux ! Il faudrait au moins 25 siècles…)</li>
<li>j’aime les noix de cajou (le système solaire aura déjà implosé d&#8217;ici qu&#8217;on casse ça…)</li>
<li>des filles à la vanille</li>
<li>san pellegrino enterre badoit</li>
<li>i love to boogie</li>
<li>tu fais du vb dommage eliane</li>
<li>entre git et svn j’ai choisi</li>
<li>plutot crever qu’installer vista</li>
<li>…</li>
</ul>


<p>Vous avez immédiatement perçu l’avantage monstrueux d’une bonne passphrase, lecteurs fûtés que vous êtes : non seulement c’est sécurisé à vie, mais en plus c’est <em>carrément plus facile à mémoriser !</em></p>

<p>Bon, vous allez me rétorquer que c’est vachement plus long à taper, et là je vous répondrais que oui, mais qu’il existe des tas d’outils de type <em>agents SSH</em>, trousseaux de clés et systèmes de mémorisation de mot de passe (dans votre navigateur par exemple), qui sont de manière générale une bonne idée (surtout si vous leur mettez un <em>mot de passe maître</em>, à taper une seule fois par session, qui les déverrouille explicitement).  Puisque nous parlons ici spécifiquement de clés SSH, nous aborderons plus loin comment éviter la saisie systématique de sa passphrase.</p>

<p>Parce que ne vous avisez <strong>surtout pas</strong> de « résoudre » le pseudo-problème de la longueur du texte en utilisant une passphrase <em>vide</em>.  Ce serait complètement stupide, parce que ça reviendrait à ne pas du tout protéger votre clé !  Donc assurez-vous d’utiliser une bonne passphrase bien solide, et préférez les agents SSH (que nous verrons plus bas, je le répète) pour vous éviter des saisies multiples.</p>

<h2>Vérifier ce qu’on a comme clé</h2>

<p>Bon, il est l’heure de vérifier si vous avez déjà une paire de clés du bon type (DSA)…</p>

<p>Sur tous les systèmes Linux et Unix, vos clés SSH sont normalement stockées dans un dossier <code>.ssh</code> à la racine de votre profil.  Ouvrez donc un terminal et tapez la commande suivante :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="go">ls -lAF ~/.ssh</span>
</span></code></pre></td></tr></table></div></figure>


<p>Si vous avez un message d’erreur (genre « je ne connais pas ce dossier ») ou un listing ne contenant que des fichiers style <code>authorized_keys</code>, <code>config</code> ou <code>known_hosts</code>, vous n’avez pas encore de clé exploitable.  Ce que vous cherchez, ce sont des fichiers qui, classiquement, s’appellent <code>id_dsa</code> (la clé privée) et <code>id_dsa.pub</code> (la clé publique).  Ce sont de bêtes fichiers texte, avec un peu d’enrobage autour de votre clé représentée dans un format appelé Base64.  Par exemple, sur mon portable, le listing donne ça :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="gp">$</span> ls -lAF ~/.ssh
</span><span class='line'><span class="go">total 48</span>
</span><span class='line'><span class="go">-rw------- 1 tdd tdd    90 déc 11  2009 config</span>
</span><span class='line'><span class="go">-rw------- 1 tdd tdd   736 aoû 23  2007 id_dsa</span>
</span><span class='line'><span class="go">-rw------- 1 tdd tdd   609 aoû 23  2007 id_dsa.pub</span>
</span><span class='line'><span class="go">-rw------- 1 tdd tdd   736 jul 17 09:17 id_dsa_git</span>
</span><span class='line'><span class="go">-rw-r--r-- 1 tdd tdd   609 jul 17 09:17 id_dsa_git.pub</span>
</span><span class='line'><span class="go">-rw------- 1 tdd tdd   668 avr  6 22:53 id_dsa_sips</span>
</span><span class='line'><span class="go">-rw-r--r-- 1 tdd tdd 23696 jul 24 11:07 known_hosts</span>
</span></code></pre></td></tr></table></div></figure>


<p>Comme vous pouvez le constater, ma clé fondamentale date un peu (23 août 2007), et j’ai une deuxième paire dédiée pour Git (<code>id_dsa_git</code>), ce qui n’a rien d’obligatoire, ainsi qu’une troisième, dont je n’ai ici que la clé privée, et qui me sert encore à autre chose.</p>

<p>Vous n’avez pas de clé DSA, ou vous en avez une dont vous ignorez la passphrase pour quelque raison que ce soit ?  Ou peut-être en voulez-vous une dédiée pour Git ?  Pas de souci, on va en créer une nouvelle !</p>

<h2>Créer une clé</h2>

<p>L’outil de prédilection pour créer des clés (et un peu tout ce qui touche à la crypto) est le système OpenSSL.  C’est un ensemble de bibliothèques et outils en ligne de commande, présent sur tous les Linux et Unix (entre autres), qui constitue le standard <em>de facto</em>.  Dommage qu’il soit si mal documenté…  Ici, on peut passer par une surcouche spécialisée dans les clés SSH, au travers de l’outil en ligne de commande <code>ssh-keygen</code>.</p>

<p>Pour créer une paire de clés DSA, on procède comme suit.  Je suppose ici que vous allez changer le nom par défaut vers <code>id_dsa_ga</code> (pour Git Attitude), mais si vous laissez le nom par défaut, il suffit de taper Entrée à la question correspondante.  Évidemment, utilisez votre propre chemin.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="gp">$</span> ssh-keygen -t dsa
</span><span class='line'><span class="go">Generating public/private dsa key pair.</span>
</span><span class='line'><span class="go">Enter file in which to save the key (/Users/tdd/.ssh/id_dsa): /Users/tdd/.ssh/id_dsa_ga</span>
</span><span class='line'><span class="go">Enter passphrase (empty for no passphrase):</span>
</span><span class='line'><span class="go">Enter same passphrase again:</span>
</span><span class='line'><span class="go">Your identification has been saved in /Users/tdd/.ssh/id_dsa_ga.</span>
</span><span class='line'><span class="go">Your public key has been saved in /Users/tdd/.ssh/id_dsa_ga.pub.</span>
</span><span class='line'><span class="go">The key fingerprint is:</span>
</span><span class='line'><span class="go">65:31:7e:ee:49:3a:66:cd:92:7b:02:2b:bf:b3:1a:79 tdd@CodeMagic.local</span>
</span><span class='line'><span class="go">The key’s randomart image is:</span>
</span><span class='line'><span class="go">+--[ DSA 1024]----+</span>
</span><span class='line'><span class="go">|          o      |</span>
</span><span class='line'><span class="go">|         . o     |</span>
</span><span class='line'><span class="go">|          + .    |</span>
</span><span class='line'><span class="go">|         o o     |</span>
</span><span class='line'><span class="go">|        S   o    |</span>
</span><span class='line'><span class="go">|       ..  B .   |</span>
</span><span class='line'><span class="go">|      o EoB =    |</span>
</span><span class='line'><span class="go">|      .ooo.+.    |</span>
</span><span class='line'><span class="go">|      .+++.o     |</span>
</span><span class='line'><span class="go">+-----------------+</span>
</span></code></pre></td></tr></table></div></figure>


<p>Suivant votre version de <code>ssh-keygen</code>, vous n’aurez pas forcément le <em>randomart</em> à la fin (et en vrai, on s’en fout), et la ligne qui suit « The key fingerprint is: » sera totalement spécifique à votre propre exécution de la commande.  Chaque paire de clés a une empreinte unique.</p>

<p>Et de fait, regardez un peu vos clés toutes neuves (vous aurez naturellement des valeurs différentes de celles présentées ici, celle de la privée étant d’ailleurs tronquée par mes soins :)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="gp">$</span> cat ~/.ssh/id_dsa_ga
</span><span class='line'><span class="go">-----BEGIN DSA PRIVATE KEY-----</span>
</span><span class='line'><span class="go">Proc-Type: 4,ENCRYPTED</span>
</span><span class='line'><span class="go">DEK-Info: DES-EDE3-CBC,6ED59B013D8A361F</span>
</span><span class='line'>
</span><span class='line'><span class="go">pB5eHHpvXxoz6i1jFzlKANv9W6SeHw664PV/1A90acR/Mw/ERQvTQKo3TaLaFhkb</span>
</span><span class='line'><span class="go">…</span>
</span><span class='line'><span class="go">NwhQFyxZZty2hn6xrv5UIAGTpjk+P2+waRmSno1Vg1x0epCp45kvFRv9AiXsOpt4</span>
</span><span class='line'><span class="go">RgzPC5+a6kjPf8EtyozGoQ==</span>
</span><span class='line'><span class="go">-----END DSA PRIVATE KEY-----</span>
</span><span class='line'><span class="gp">$</span> cat ~/.ssh/id_dsa_ga.pub
</span><span class='line'><span class="go">ssh-dss AAAAB3NzaC1kc3MAAACBAJhbQcZK8lFMvpw7trbFj51Sqjd9nKBu2xkw/kvUAQlPQPaIRLOiq92fxp+jzp97xDqpwFnvU++ptUiB1nQQ8oq8l5t5QuHwfMMnSDMXhWf2235i4Lw2DtRTbxs0UQJ1l+QxO/AjlV/POcFpq6Z0PKMosi8TslqqPaqAbQtiEX2DAAAAFQDaK1EZY12itrt0lomTAOT0QATilwAAAIAK9C0YTR0T82r7TFheo/+vU6dS9KCypEjR7rEVf7MxCJLd9MQNkVTJe7XCFnYeT9oz7h8NbYHGyDQr7EZGIchtiju6EPFWuQWEAJAHq7z9s9ygoVqyWSQo0y/6riihJk5bo+Etj//OdwndlfKg0c6UGBFg8T2i6nKsbmMMEAI+XAAAAIA+bPjEeoZhwLuCp3Bv0+B4mWgGqnb2IhRSVDQNYeHIofhiSY7prVB+O1iQhrN/EJlygkaFWNaVlPmxrXa+8i+ZGWeVlAaKJdSAsDawNjOaHTi6/Cfqm7NTrLIIeOcjjxwrPLPZ3v0tP8MFjhYFdgjooYjTDzqQmpCGVSA4hXtqhg== tdd@CodeMagic.local</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notez que les clés publiques sont généralement formatées sur une seule ligne ; dans une liste de clés (par exemple le fichier <code>~/.ssh/authorized_keys</code>, qui liste les clés publiques dont les titulaires peuvent accéder à votre compte <em>via</em> SSH), on a donc en général une clé par ligne.  La fin de la clé publique est son commentaire, qui vaut par défaut « identifiant@machine », mais peut être changé.</p>

<p>Dernière info sur la manipulation des fichiers de clé : on peut changer la passphrase d’une clé SSH avec la ligne de commande suivante :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="gp">$</span> ssh-keygen -p -f ~/.ssh/le_fichier_de_cle
</span></code></pre></td></tr></table></div></figure>


<p>La commande vous demandera votre ancienne passphrase, puis la nouvelle avec une double saisie (initiale puis de confirmation).  Pratique si vous aviez saisi une passphrase un peu pourrie, par exemple.  En revanche, si votre clé est compromise (vous avez des raisons de penser qu’un tiers s’est approprié votre clé privée), <em>ne changez pas la passphrase</em> (ça ne servira à rien) : <strong>changez de clé !</strong></p>

<h2>Agents SSH</h2>

<p>Un agent SSH est un outil intégré à votre système d’exploitation qui vous permet de ne saisir la passphrase d’une clé qu’une seule fois (pendant la durée de vie de l’agent, généralement limitée à votre session, entre connexion et déconnexion).</p>

<p><strong>OS X</strong> intègre cette fonction dans son outil plus général de Trousseau d’Accès (<em>Keyring</em>) depuis Leopard (10.5).  Avant cela (par exemple Tiger, la 10.4), il fallait <a href="http://matt.simerson.net/2007/07/28/ssh-agent-and-mac-os-x">ruser comme décrit dans cet article</a>.  La première utilisation d’une clé entraîne l’affichage d’une demande de passphrase, et la possibilité de stocker celle-ci dans le trousseau d’accès pour éviter des saisies supplémentaires durant la session.</p>

<p><strong>Ubuntu</strong> et ses variantes intègrent cette fonction aux principaux gestionnaires de fenêtre (Gnome, KDE, etc.).  Le workflow est similaire à celui d’OS X : la première utilisation entraîne une demande de passphrase avec persistence dans l’agent.</p>

<p>Pour <strong>les autres distributions</strong> Linux et gestionnaires de fenêtre, je ne sais pas trop si un agent est déjà disponible ou pas.  Vous pouvez le vérifier en ouvrant un terminal puis en tapant :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="go">set | grep SSH_AUTH_SOCK</span>
</span></code></pre></td></tr></table></div></figure>


<p>Si vous ne voyez rien s’afficher, vous n’avez pas d’agent actif ; si vous voyez quelque chose (probablement du genre <code>/var/run/….sock</code>), alors vous en avez un.</p>

<p>Si vous n’avez pas d’agent actif, vous pouvez en lancer un manuellement à l’aide de la bien-nommée commande <code>ssh-agent</code>.  Celle-ci crée un processus résident (un <em>daemon</em>) et affiche la série de commandes à balancer dans l’environnement (ou dans chaque terminal) pour qu’il soit au courant que l’agent existe, et donc qu’il essaie de s’en servir.  Ces commandes consistent généralement juste à définir les variables d’environnement <code>SSH_AUTH_SOCK</code> et <code>SSH_AGENT_PID</code>.  Du coup quand on lance un agent à la main dans le shell courant, on récupère généralement son affichage pour l’exécuter aussi sec, comme ceci :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="gp">$</span> <span class="nb">eval</span> <span class="sb">`</span>ssh-agent<span class="sb">`</span>
</span><span class='line'><span class="go">Agent pid 23038</span>
</span></code></pre></td></tr></table></div></figure>


<p>Évidemment, vous verrez un autre numéro de processus (<em>pid</em>), mais le principe est le même.</p>

<p>À partir de là, à vous de tester le comportement lors de la première utilisation d’une clé SSH : si vous voyez une interception globale vous demandant de saisir la passphrase et proposant de la stocker dans l’agent, tout baigne.  Si ce n’est pas le cas, vous allez devoir ajouter la passphrase à l’agent manuellement, en utilisant la commande <code>ssh-add</code>.  Dans ce cas, soit vous avez une seule clé, et vous n’avez pas besoin de la préciser, soit vous en avez plusieurs et il faut indiquer laquelle :</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="gp">$</span> ssh-add ~/.ssh/id_dsa_ga
</span><span class='line'><span class="go">Enter passphrase for /Users/tdd/.ssh/id_dsa_ga:</span>
</span><span class='line'><span class="go">Identity added: /Users/tdd/.ssh/id_dsa_ga (/Users/tdd/.ssh/id_dsa_ga)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Après ça, la passphrase est automatiquement exploitée pendant toute la durée de vie de l’agent.</p>

<p>Ce type de manip’ est notamment utile quand on se connecte sur un serveur de production où on va faire une série de <code>git pull</code>, <code>git submodule update</code>, etc. et où on veut éviter de taper sa passphrase une tonne de fois.  On commence par configurer l’agent, ajouter sa clé, et hop ! On est prêt à rouler.</p>

<p>Enfin, pour ce qui est de <strong>Windows</strong>, avec msysGit spécifiquement, vous trouverez quelques instructions pour lancer automatiquement ssh-agent sur <a href="http://help.github.com/working-with-key-passphrases/">cette documentation chez GitHub</a>.</p>

<h2>Publier sa clé publique ?</h2>

<p>Les clés asymétriques ne sont pas seulement utiles pour SSH et les systèmes se greffant par-dessus.  Elles sont aussi, par exemple, le moyen privilégié pour (dé)crypter ou signer numériquement (ou les deux) les e-mails.  Je rêve du jour où tout le monde saura utiliser correctement le medium e-mail : pas de pièces jointes énormes ou débiles, pas de liste d’e-mails destinataires visible par tout le monde, pas de HTML pourri rempli de Comic Sans MS… et l’habitude de signer les e-mails importants.  Ce dernier point, notamment, ouvrira le chemin des e-mails comme moyen valide de communication à valeur légale, par exemple avec votre banquier, votre notaire, votre avocat, etc.</p>

<p>Si le sujet vous intéresse, jetez par exemple un œil au client de messagerie Thunderbird et à son extension Enigmail, basée sur l’outil libre GnuPG (naturellement, il existe d’autres possibilités techniques autour d’Apple Mail, de GMail et j’en passe).</p>

<p>Dans un tel contexte, il est important de pouvoir facilement récupérer la <em>clé publique</em> de quelqu’un, soit parce qu’on veut lui envoyer un contenu  confidentiel (on va donc le chiffrer avec la clé publique du destinataire, dont seule la clé privée pourra déchiffrer), soit parce qu’on a reçu un e-mail signé numériquement de cette personne (grâce à sa clé privée), et qu’on veut vérifier que ça vient bien d’elle, et que le contenu n’a pas été altéré (ce qu’on peut faire uniquement à l’aide de sa clé publique).</p>

<p>Bien entendu, la personne en question peut nous avoir, au préalable, transmis sa clé publique.  Encore faut-il pouvoir faire confiance au mécanisme qui a fait cette transmission (il existe des moyens, dont l’empreinte de la clé, mais ce n’est pas le sujet de cet article).  Un autre moyen plus général est, pour la personne, de publier sa clé publique aux yeux de tous.  Pour cela, il existe des <strong>serveurs de clés</strong>.  La plupart sont gratuits, et les plus connus sont répertoriés par les principaux systèmes exploitant des clés.  En voici quelques-uns :</p>

<ul>
<li><a href="https://keyserver.pgp.com">keyserver.pgp.com</a></li>
<li><a href="http://pgpkeys.mit.edu">pgpkeys.mit.edu</a></li>
<li><a href="https://pgp.webtru.st/">pgp.webtru.st/</a></li>
</ul>


<h2>Et Git dans tout ça ?</h2>

<p>La plupart des hébergements de dépôt Git reposent sur des clés SSH publiques pour identifier les personnes ayant un accès aux dépôts.  Lorsque vous accédez à un dépôt authentifié, que ce soit en protocole <code>git://</code>… ou <code>git@</code>…, le système SSH sous-jacent va passer en revue vos clés privées au regard des clés publiques qu’il connaît, et s’il trouve une correspondance, vous demander la passphrase (à moins qu’un agent ne la lui fournisse tout seul) puis engager la suite des opérations.</p>

<p>Dans le cadre des ateliers Git Attitude, lorsque nous étudions l’interaction avec des dépôts distants, j’ai besoin de disposer de clés publiques dont vous avez l’homologue privée, afin de configurer vos accès au serveur Gitosis que nous utilisons.  Vous recevez dans vos convocations une demande pour me fournir cette clé à l’avance, avec un lien vers cet article si vous vous sentez déboussolés :-)</p>

<p>J’espère que cet article vous a été utile, et vous a permis de mieux comprendre les clés SSH et leurs meilleures pratiques d’utilisation.  Si vous avez des questions, commentaires ou corrections, les commentaires sont là pour ça !</p>
]]></content>
  </entry>
  
</feed>
