<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>romain.getBlog( ); &#187; git</title>
	<atom:link href="http://linsolas.free.fr/wordpress/index.php/category/git/feed/" rel="self" type="application/rss+xml" />
	<link>http://linsolas.free.fr/wordpress</link>
	<description></description>
	<lastBuildDate>Wed, 23 Jan 2013 21:29:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Cours du soir &#8211; Git</title>
		<link>http://linsolas.free.fr/wordpress/index.php/2010/04/cours-du-soir-git/</link>
		<comments>http://linsolas.free.fr/wordpress/index.php/2010/04/cours-du-soir-git/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 21:44:58 +0000</pubDate>
		<dc:creator>Romain</dc:creator>
				<category><![CDATA[git]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[valtech]]></category>

		<guid isPermaLink="false">http://linsolas.free.fr/wordpress/?p=122</guid>
		<description><![CDATA[David Gageot (blog ; twitter) nous a fait l&#8217;honneur de revenir dans ses anciens locaux, chez nous à Valtech, afin de nous faire une présentation sur Git. Cette présentation, il l&#8217;avait déjà jouée à Vidal il y a quelques jours, et devait faire de nombreux heureux lors de prochains JUG (Ch&#8217;tiJUG, puis Paris JUG mi [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://git-scm.com/images/header.gif" alt="Git" /></p>
<div id="_mcePaste">David Gageot (<a href="http://blog.javabien.net" onclick="pageTracker._trackPageview('/outgoing/blog.javabien.net?referer=');">blog</a> ; <a href="http://twitter.com/dgageot" onclick="pageTracker._trackPageview('/outgoing/twitter.com/dgageot?referer=');">twitter</a>) nous a fait l&#8217;honneur de revenir dans ses anciens locaux, chez nous à <a href="http://www.valtech.fr" onclick="pageTracker._trackPageview('/outgoing/www.valtech.fr?referer=');">Valtech</a>, afin de nous faire une présentation sur <a href="http://git-scm.com/" onclick="pageTracker._trackPageview('/outgoing/git-scm.com/?referer=');">Git</a>. Cette présentation, il l&#8217;avait déjà jouée à Vidal il y a quelques jours, et devait faire de nombreux heureux lors de prochains JUG (Ch&#8217;tiJUG, puis Paris JUG mi mai).</div>
<p><br/></p>
<div>Nous étions une dizaine à écouter l&#8217;enthousiasme de David sur cet outil, qu&#8217;il pratique depuis presque 2 ans au sein de la socité dont il est le CTO, <a href="https://www.algodeal.com/" onclick="pageTracker._trackPageview('/outgoing/www.algodeal.com/?referer=');">Algodeal</a>.</div>
<div id="_mcePaste">Avant d&#8217;attaquer la présentation, un rapide tour de table est réalisé. Qui utilise quel outil pour gérer ses sources, et qui connait et utilise Git ? La plupart d&#8217;entre nous utilisons Subversion, et nous connaissions presque tous Git, sans pour autant l&#8217;avoir déjà utilisé.</div>
<p><br/></p>
<div id="_mcePaste">Puis, pour capter plus encore notre attention (comme si cela était nécessaire !), David commence en nous montrant un cas où Git lui a épargné bien des tracas, et sans aucun doute, de très longues heures de recherche. Sur son projet, la commande &laquo;&nbsp;<em>mvn eclipse:eclipse</em>&nbsp;&raquo; ne fonctionne plus (c&#8217;est le drame). Pour information, cette commande analyse un projet configuré sous Maven, et en établit les fichiers de configuration d&#8217;Eclipse (les <em>.project</em> et <em>.classpath</em> en particulier) afin de l&#8217;intégrer au sein de l&#8217;IDE. Donc cette commande ne fonctionne plus. Que faire pour comprendre pourquoi, et savoir quand le problème est apparu.</div>
<p><br/></p>
<div id="_mcePaste">David nous sort son premier joker, sous le nom de &laquo;&nbsp;<em>git bisect</em>&laquo;&nbsp;. Il faut savoir que Git est en réalité est constitué d&#8217;une batterie d&#8217;outils (un peu comme Maven avec sa pléthore de plugins, à l&#8217;exception que Git ne télécharge jamais tout Internet pour travailler <img src='http://linsolas.free.fr/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ). &laquo;&nbsp;<em>bisect</em>&nbsp;&raquo; est l&#8217;un d&#8217;entre eux. Donc David sait que sur une version un peu ancienne, tagguée VERSION1.1.3, la commande Maven fonctionnait bien, mais plus maintenant. Il va donc demander à Git de trouver quand, dans cet intervalle de temps séparant la version 1.1.3 à aujourd&#8217;hui, la regression est apparue. Il lance donc la commande suivante :</div>
<blockquote>
<div id="_mcePaste">git bisect start HEAD VERSION1.1.3</div>
</blockquote>
<div>Grosso-modo, cela indique que l&#8217;on va lancer l&#8217;analyse bisect entre le HEAD (code courant) et la version tagguée 1.1.3.</div>
<div id="_mcePaste">Ensuite, on va exécuter la commande suivante :</div>
<blockquote>
<div id="_mcePaste">git bisect run sh -c &laquo;&nbsp;mvn eclipse:eclipse &gt; /dev/null&nbsp;&raquo;</div>
</blockquote>
<div>On indique à Git d&#8217;éxecuter la commande SH &laquo;&nbsp;mvn eclipse:eclipse &gt; /dev/null&nbsp;&raquo; (on redirige vers le /dev/null pour éviter trop de logs). Là, Git nous indique qu&#8217;entre la version 1.1.3 et le HEAD, il y avait environ 140 révisions du code. Git bisect estime à 7 le nombre maximum de tentatives dont il aura besoin pour trouver le commit fautif (utilisation du principe de dichotomie). Après ces tests, notre outil finit par détecter le commit ayant introduit cette erreur. Voici les logs de git bisect :</div>
<blockquote>
<div>cat ../maveneclipse.sh</div>
<div id="_mcePaste">#!/bin/sh</div>
<div id="_mcePaste">mvn eclipse:eclipse &gt; /dev/null</div>
<div id="_mcePaste">git bisect start HEAD VERSION1.1.3</div>
<div id="_mcePaste">git run ../maveneclipse.sh</div>
<div id="_mcePaste">running ../maveneclipse.sh</div>
<div id="_mcePaste">Bisecting: 140 revisions left to test after this (roughly 7 steps)</div>
<div id="_mcePaste">[49be0b426f3469b154d66179ecdbaad2128b872e] Now formats Javadocs</div>
<div id="_mcePaste">running ../maveneclipse.sh</div>
<div id="_mcePaste">Bisecting: 70 revisions left to test after this (roughly 6 steps)</div>
<div id="_mcePaste">[18a0eddab7a745c9cec538b9184efb25499e06c1] More optimisations</div>
<div id="_mcePaste">running ../maveneclipse.sh</div>
<div id="_mcePaste">Bisecting: 37 revisions left to test after this (roughly 5 steps)</div>
<div id="_mcePaste">[051bccc6252b23be6c9074545986cd057bcc69d8] Merge branch &#8216;master&#8217;</div>
<div id="_mcePaste">running ../maveneclipse.sh</div>
<div id="_mcePaste">Bisecting: 15 revisions left to test after this (roughly 4 steps)</div>
<div id="_mcePaste">[1183351cf1976571138c80dcf70e702dc3575177] Merge branch &#8216;master&#8217;</div>
<div id="_mcePaste">running ../maveneclipse.sh</div>
<div id="_mcePaste">Bisecting: 7 revisions left to test after this (roughly 3 steps)</div>
<div id="_mcePaste">[a586dcbddca57d93e00ed7ebaeb02239bfdc515c] Merge branch &#8216;master&#8217;</div>
<div id="_mcePaste">running ../maveneclipse.sh</div>
<div id="_mcePaste">Bisecting: 3 revisions left to test after this (roughly 2 steps)</div>
<div id="_mcePaste">[b4938d0a2aacabb4e71c2c08cab5e63ce12efbce] Merge branch &#8216;master&#8217;</div>
<div id="_mcePaste">running ../maveneclipse.sh</div>
<div id="_mcePaste">Bisecting: 1 revision left to test after this (roughly 1 step)</div>
<div id="_mcePaste">[6536952979f24786db146217b81f7d612bede425] Before we fix the build</div>
<div id="_mcePaste">running ../maveneclipse.sh</div>
<div id="_mcePaste">Bisecting: 0 revisions left to test after this (roughly 0 steps)</div>
<div id="_mcePaste">[56750bb15630dbf1af1976ad0e7161c7ed696e69] Force Maven3</div>
<div id="_mcePaste">running ../maveneclipse.sh</div>
<div id="_mcePaste">56750bb15630dbf1af1976ad0e7161c7ed696e69 is the first bad commit</div>
<div id="_mcePaste">commit 56750bb15630dbf1af1976ad0e7161c7ed696e69</div>
<div id="_mcePaste">Author: David Gageot &lt;gageot&gt;</div>
<div id="_mcePaste">Date:   Wed Mar 17 18:20:29 2010 +0100</div>
<div id="_mcePaste">Enforce Maven3</div>
</blockquote>
<div id="_mcePaste">On le voit à la toute fin, c&#8217;est un commit réalisé par David le 17 mars, avec pour commentaire &laquo;&nbsp;Enforce Maven 3&#8243; qui a introduit ce problème.</div>
<p><br/></p>
<div id="_mcePaste">(<a href="http://blog.javabien.net/2010/03/23/git-bisect-might-save-your-day" onclick="pageTracker._trackPageview('/outgoing/blog.javabien.net/2010/03/23/git-bisect-might-save-your-day?referer=');">post du blog de David</a> relatant la traque de ce problème)</div>
<p><br/></p>
<div>Voilà comment, en quelques secondes, l&#8217;outil Git bisect a permis à David de comprendre où était le problème, et comment du coup le résoudre (non, il n&#8217;existe pas encore d&#8217;outil corrigeant automatiquement les bugs dans Git <img src='http://linsolas.free.fr/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ).</div>
<p><br/></p>
<div id="_mcePaste">Comme introduction, je pense que David a réussi son coup ! Nous sommes déjà sous le charme&#8230;</div>
<div>S&#8217;ensuit alors une présentation des aspects plus basiques de Git. Comme créer un repository, explications des commandes classiques (clone, commit, pull, push, etc.). Là dessus, je pense que j&#8217;écrirais un nouveau post un peu plus tard, une fois que je commencerais à mieux maitriser l&#8217;outil, et ses particularités. Je voudrais éviter de dire trop de bêtises pour l&#8217;instant !</div>
<p><br/></p>
<div>Mais dans les grandes lignes, David a bien insisté sur la simplicité de l&#8217;outil &#8211; bien qu&#8217;il soit assez déroutant aux premiers abords &#8211; mais également sur sa puissance et sa robustesse. Il nous a indiqué n&#8217;avoir jamais eu a pesté contre l&#8217;outil en 2 ans d&#8217;utilisation ! Connaissant David, je peux vous assurer que si un outil ne lui plaît pas, il ne se gênera pas pour qu&#8217;on le sache <img src='http://linsolas.free.fr/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  L&#8217;une des grandes forces de Git, c&#8217;est son intelligence à comprendre les structures des projets, de s&#8217;adapter facilement et de façon non intrusive aux différentes modifications du code, et à gérer d&#8217;une manière presque magique tous les merges.</div>
<p><br/></p>
<div>Un exemple qui me parle tout à fait est celui-ci :</div>
<div>Sa société s&#8217;appelait l&#8217;année dernière tech4quant. Par conséquent, l&#8217;ensemble des packages Java démarraient par <em>com.tech4quant.*</em>. Il y a quelques mois, la société a été renommée Algodeal. Du coup, David a décidé de renommer tous les packages en <em>com.algodeal.*</em>. Or en Java, un package se trouve dans le répertoire du même nom (donc ici com/tech4quant/&#8230; et com/algodeal/&#8230;). Or si vous connaissez CVS ou Subversion, vous savez que cette tâche est pratiquement impossible, ou du moins les obstacles à sa bonne réalisation vous pousse à tout simplement éviter un tel renommage ! Pourtant, grâce à Git, David a réalisé cela de façon tout à fait normale, en exécutant simplement les tâches de renommage de répertoires, et de refactoring massif du code Java (histoire de changer le nom des packages ainsi que les import). Git, s&#8217;est quant à lui chargé de tout gérer proprement, sans perte d&#8217;historique, sans aucune douleur. Une fois de plus, bravo Git !</div>
<p><br/></p>
<div>On a bien entendu évoqué l&#8217;intégration de l&#8217;outil dans l&#8217;écosystème du développeur (Java essentiellement). Les plugins Eclipse ne sont pas encore très au point, et David se sert beaucoup du terminal mais également de <a href="http://gitx.frim.nl/" onclick="pageTracker._trackPageview('/outgoing/gitx.frim.nl/?referer=');">GitX</a>, qui propose une visualisation très agréable de l&#8217;historique d&#8217;une ressource, et se montre assez à l&#8217;aise avec les différentes opérations de commit.</div>
<p><br/></p>
<div id="_mcePaste">Bref, David a facilement réussi à convaincre ses auditeurs de l&#8217;intérêt de Git. Reste que je reste toujours très sceptiques quant à l&#8217;adoption de cet outil au sein de grandes sociétés, et je ne peux hélas que le regretter, tant mon attrait pour Git s&#8217;est accru ce soir !</div>
<p><br/></p>
<div>Merci à David pour ta présentation, merci également à Yannick Ameur pour avoir eu l&#8217;idée d&#8217;organiser ce cours du soir.</div>
<a href="javascript:toggleStartStop();PicLensLite.start({feedUrl:'http://linsolas.free.fr/wordpress/wp-content/plugins/wp-piclens/mrss.php?id=122'});">Start Slide Show with PicLens Lite <img src="http://linsolas.free.fr/wordpress/wp-content/plugins/wp-piclens/PicLensButton.png" alt="PicLens" width="16" height="12" border="0" align="top"></a>]]></content:encoded>
			<wfw:commentRss>http://linsolas.free.fr/wordpress/index.php/2010/04/cours-du-soir-git/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
