<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Git on Jean-Christophe Gay</title><link>https://jeanchristophegay.com/tags/git/</link><description>Recent content in Git on Jean-Christophe Gay</description><generator>Hugo -- gohugo.io</generator><language>fr-FR</language><copyright>© 2026 Jean-Christophe Gay</copyright><lastBuildDate>Tue, 18 Aug 2026 23:08:47 +0200</lastBuildDate><atom:link href="https://jeanchristophegay.com/tags/git/index.xml" rel="self" type="application/rss+xml"/><item><title>Fusion de dépôts Git</title><link>https://jeanchristophegay.com/posts/merge-git-repositories/</link><pubDate>Sun, 07 Feb 2016 13:37:00 +0200</pubDate><guid>https://jeanchristophegay.com/posts/merge-git-repositories/</guid><description>&lt;p&gt;Comment fusionner de multiples dépôts Git en un seul ?&lt;/p&gt;

&lt;h1 class="relative group"&gt;What ?!
 &lt;div id="what-" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;Récemment j&amp;rsquo;ai eu besoin de fusionner tout un tas de dépôts Git en un seul. Une collection d&amp;rsquo;applications et de socles métier répartis sur 6 dépôts. Bien sûr des dépendances binaires entre tout ce petit monde et toujours sur la dernière version en cours de développement.
Observant que le cycle de vie des projets étaient toujours le même on a voulu simplifier nos processus (branches, gestion de dépendances, build, release, etc.) sans aller jusqu&amp;rsquo;à la pratique du mono dépôt (comme chez &lt;a href="https://youtu.be/W71BTkUbdqE" target="_blank" rel="noreferrer"&gt;Google&lt;/a&gt; par exemple).&lt;/p&gt;

&lt;h1 class="relative group"&gt;Mise en place
 &lt;div id="mise-en-place" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#mise-en-place" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;On veut bien entendu garder l&amp;rsquo;historique de tous nos projets, il n&amp;rsquo;est pas question de repartir de zéro 😅.&lt;/p&gt;
&lt;p&gt;Il existe un projet, &lt;a href="https://github.com/robinst/git-merge-repos" target="_blank" rel="noreferrer"&gt;git-merge-repos&lt;/a&gt; qui permet de faire le travail en essayant de préserver les branches et les tags.&lt;/p&gt;
&lt;p&gt;Le résultat attendu est un dépôt unique contenant tous les projets désirés :&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;new-repo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── project-1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── project-2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── project-3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── project-4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;On peut utiliser deux stratégies pour faire ce merge :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Réaliser un merge (avec n parents) et déplacer chaque projet dans son sous-dossier dans le commit de merge&lt;/li&gt;
&lt;li&gt;Réécrire l&amp;rsquo;histoire de chaque dépôt pour déplacer chaque contenu de commit dans un sous-dossier et réaliser le merge à la fin.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;J&amp;rsquo;ai d&amp;rsquo;abord testé avec la première option, le problème est qu&amp;rsquo;on ne voit plus l&amp;rsquo;historique d&amp;rsquo;une ressource après le commit de merge global.&lt;/p&gt;
&lt;p&gt;Par exemple :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; git log -- project-1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ne retourne qu&amp;rsquo;une seule entrée, le commit de merge.&lt;/p&gt;
&lt;p&gt;La solution 2 est donc vendue !&lt;/p&gt;
&lt;p&gt;Par contre comme on doit réécrire l&amp;rsquo;historique de chaque dépôt, il faut trouver un moment où une seule branche est en cours de développement (dans mon cas &lt;code&gt;master&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Pour chaque dépôt :&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;gt; git clone --mirror git@example.com:project-1.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;gt; cd project-1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;gt; git filter-branch --index-filter \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;tab=$(printf &amp;#34;\t&amp;#34;) &amp;amp;&amp;amp; git ls-files -s --error-unmatch . &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; [ $? != 0 ] || (git ls-files -s | sed &amp;#34;s-$tab\&amp;#34;*-&amp;amp;project1/-&amp;#34; | GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info &amp;amp;&amp;amp; mv &amp;#34;$GIT_INDEX_FILE.new&amp;#34; &amp;#34;$GIT_INDEX_FILE&amp;#34;)&amp;#39; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --tag-name-filter cat \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -- --all&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;où &lt;code&gt;project1&lt;/code&gt; doit être remplacé par le sous-dossier dans lequel on veut transférer le projet.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;en ai profité aussi pour renommer les tags, &lt;a href="https://github.com/robinst/git-merge-repos" target="_blank" rel="noreferrer"&gt;git-merge-repos&lt;/a&gt; s&amp;rsquo;occupe aussi de recréer les tags dans le dépôt final sur la base de leurs noms. Dans mon cas je ne le voulais pas vraiment, des tags sur différents dépôts portaient le même nom mais n&amp;rsquo;étaient pas forcément équivalents.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; git tag | xargs -I '{}' sh -c 'git tag project-1-{} {} &amp;amp;&amp;amp; git tag -d {}'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;L&amp;rsquo;opération finale est le lancement la fusion :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; git clone git@github.com:robinst/git-merge-repos.git
&amp;gt; cd git-merge-repos
&amp;gt; ./run.sh /absolute/path/to/project-1:. /absolute/path/to/project-2:.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le résultat se trouve dans un dossier &lt;code&gt;merged&lt;/code&gt; à la racine de &lt;a href="https://github.com/robinst/git-merge-repos" target="_blank" rel="noreferrer"&gt;git-merge-repos&lt;/a&gt;.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Avantages
 &lt;div id="avantages" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#avantages" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;L&amp;rsquo;intendance est plus facile (création de branches, merge, etc)&lt;/li&gt;
&lt;li&gt;On a aujourd&amp;rsquo;hui de vrais commits atomiques pour la réalisation d&amp;rsquo;une fonctionnalité. Avant on se retrouvait tout le temps avec des commits sur différents dépôts et ce n&amp;rsquo;était pas toujours facile à tracer ou pour investiguer sur des régressions&lt;/li&gt;
&lt;li&gt;La gestion des dépendances est plus simple, tout le code est dans le même dépôt&lt;/li&gt;
&lt;li&gt;Maintenant qu&amp;rsquo;on est capable de builder nos projets sans dépendances binaires sur des &lt;code&gt;SNAPSHOT&lt;/code&gt;, on a mis en place le build de nos Pull Request avec &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/GitHub&amp;#43;pull&amp;#43;request&amp;#43;builder&amp;#43;plugin" target="_blank" rel="noreferrer"&gt;GH Pull Request Builder&lt;/a&gt; pour &lt;a href="https://jenkins-ci.org" target="_blank" rel="noreferrer"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dans la case inconvénient on peut noter :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allongement du temps de build, même si ce n&amp;rsquo;est pas totalement vrai, mais avant avec les dépôts séparés on ne reconstruisait pas forcément tous les projets pour valider nos changements&lt;/li&gt;
&lt;li&gt;On utilise Maven pour construire nos projets, notre projet multi-modules géant demande un peu plus de gymnastique intellectuelle pour lancer un build. Une fois qu&amp;rsquo;on a assimilé l&amp;rsquo;utilisation des options &lt;code&gt;-pl&lt;/code&gt; et &lt;code&gt;-am(d)&lt;/code&gt; c&amp;rsquo;est tout de même faisable 😇&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Publier son site Maven sur GitHub Pages</title><link>https://jeanchristophegay.com/posts/publier-son-site-maven-sur-github-pages/</link><pubDate>Sat, 17 Aug 2013 18:10:00 +0200</pubDate><guid>https://jeanchristophegay.com/posts/publier-son-site-maven-sur-github-pages/</guid><description>&lt;p&gt;Tout fier de son projet hébergé sur &lt;a href="http://github.com" target="_blank" rel="noreferrer"&gt;GitHub&lt;/a&gt;, il existe un mécanisme de publication de site statique, les &lt;a href="http://pages.github.com/" target="_blank" rel="noreferrer"&gt;GitHub Pages&lt;/a&gt;. Petit tour de piste pour configurer le déploiement de site &lt;a href="http://maven.apache.org/" target="_blank" rel="noreferrer"&gt;Maven&lt;/a&gt; sur cet espace.&lt;/p&gt;

&lt;h1 class="relative group"&gt;The Maven way
 &lt;div id="the-maven-way" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-maven-way" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;Le maven-site-plugin permet de déployer les sites via différents protocoles configurables avec des providers &lt;a href="http://maven.apache.org/wagon/" target="_blank" rel="noreferrer"&gt;wagon&lt;/a&gt;. Coup de chance il existe une section pour l&amp;rsquo;utilisation des gh-pages: &lt;a href="http://maven.apache.org/wagon/wagon-providers/wagon-scm/usage.html#Deploying_your_Maven_site_to_GitHubs_gh-pages" target="_blank" rel="noreferrer"&gt;Deploying your Maven site to GitHub&amp;rsquo;s gh-pages&lt;/a&gt;.&lt;br&gt;
Malheureusement je n&amp;rsquo;ai pas réussi à le faire fonctionner… Je suis tombé sur ce &lt;a href="http://jira.codehaus.org/browse/WAGON-374" target="_blank" rel="noreferrer"&gt;ticket&lt;/a&gt; qui donne des pistes (enfin pas sûr que ça fonctionne au final) mais qui indique surtout qu&amp;rsquo;il faut utiliser &lt;a href="http://maven.apache.org/plugins/maven-scm-publish-plugin/" target="_blank" rel="noreferrer"&gt;Maven SCM Publish Plugin&lt;/a&gt;.&lt;br&gt;
Par contre ce n&amp;rsquo;est pas intégré à la fonctionalité de reporting de Maven, pas de &lt;code&gt;mvn site-deploy&lt;/code&gt; out of the box.&lt;br&gt;
Je ne l&amp;rsquo;ai pas testé, je me suis plutôt rabattu sur le plugin maven développé par GitHub qui avait l&amp;rsquo;air de répondre à mes attentes.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Plugin GitHub
 &lt;div id="plugin-github" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#plugin-github" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;Dans le &lt;a href="https://github.com/github/maven-plugins" target="_blank" rel="noreferrer"&gt;repository officiel&lt;/a&gt; de GitHub est disponible le &lt;a href="http://github.github.com/maven-plugins/site-plugin" target="_blank" rel="noreferrer"&gt;Site Plugin&lt;/a&gt;.&lt;br&gt;
Un petit peu de configuration :&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-site-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.3&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 &lt;span class="nt"&gt;&amp;lt;skipDeploy&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/skipDeploy&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.github.github&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;site-maven-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;0.8&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 &lt;span class="nt"&gt;&amp;lt;message&amp;gt;&lt;/span&gt;Creating site for ${project.version}&lt;span class="nt"&gt;&amp;lt;/message&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 &lt;span class="nt"&gt;&amp;lt;repositoryOwner&amp;gt;&lt;/span&gt;_&lt;span class="nt"&gt;&amp;lt;/repositoryOwner&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;repositoryName&amp;gt;&lt;/span&gt;_&lt;span class="nt"&gt;&amp;lt;/repositoryName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;server&amp;gt;&lt;/span&gt;github&lt;span class="nt"&gt;&amp;lt;/server&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	 &lt;span class="nt"&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 	 &lt;span class="nt"&gt;&amp;lt;phase&amp;gt;&lt;/span&gt;site-deploy&lt;span class="nt"&gt;&amp;lt;/phase&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 	 &lt;span class="nt"&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;site&lt;span class="nt"&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;avec&lt;br&gt;
&lt;code&gt;repositoryOwner&lt;/code&gt;: nom d&amp;rsquo;utilisateur,&lt;br&gt;
&lt;code&gt;repositoryName&lt;/code&gt;: nom du repository,&lt;br&gt;
&lt;code&gt;server&lt;/code&gt;: identifiant du serveur dans &lt;em&gt;settings.xml&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;servers&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;server&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;github&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;username&amp;gt;&lt;/span&gt;GitHubLogin&lt;span class="nt"&gt;&amp;lt;/username&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;password&amp;gt;&lt;/span&gt;GitHubPassw0rd&lt;span class="nt"&gt;&amp;lt;/password&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/server&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/servers&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Et voilà &lt;code&gt;mvn site-deploy&lt;/code&gt; génère et publie le site sur vos gh-pages (peut prendre une dizaine de minutes avant qu&amp;rsquo;il ne soit disponible).&lt;/p&gt;
&lt;p&gt;Si vous ne l&amp;rsquo;avez pas encore fait, pensez à utiliser le skin &lt;a href="http://maven.apache.org/skins/maven-fluido-skin/index.html" target="_blank" rel="noreferrer"&gt;maven-fluido-skin&lt;/a&gt; qui modernise le rendu de votre site !&lt;/p&gt;</description></item><item><title>Git mergetool avec P4Merge sous MacOS</title><link>https://jeanchristophegay.com/posts/git-mergetool-avec-p4merge-sous-mac-os/</link><pubDate>Sat, 09 Mar 2013 12:40:00 +0200</pubDate><guid>https://jeanchristophegay.com/posts/git-mergetool-avec-p4merge-sous-mac-os/</guid><description>&lt;p&gt;Quelque soit le gestionnaire de sources que l’on utilise, vient toujours le moment où des conflits apparaissent lors des merge.
Dans ces cas là, chacun sa technique, personnellement, que ce soit pour l’affichage d’un diff ou un merge, je préfère les outils graphiques.
J’ai longtemps utilisé les outils de tortoise sous Windows, mais à force de papillonner entre différents OS, j’ai cherché un outil disponible sur toutes les plateformes.
Et je me suis finalement arrêté sur P4Merge&amp;hellip;&lt;/p&gt;
&lt;p&gt;Malgré un rendez-vous manqué avec Perforce (&lt;a href="https://jeanchristophegay.com/posts/git-p4-au-secours-de-perforce/" &gt;git-p4&lt;/a&gt;), l’outil de merge disponible au sein de la distribution de Perforce est plutôt réussi (une fois que l’on a compris le mécanisme de sélection à l’aide des trois coquillages).&lt;/p&gt;

&lt;h1 class="relative group"&gt;Installation
 &lt;div id="installation" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#installation" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Télécharger une distribution Perforce : &lt;a href="http://www.perforce.com/downloads/complete_list" target="_blank" rel="noreferrer"&gt;http://www.perforce.com/downloads/complete_list&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copier &lt;strong&gt;p4merge&lt;/strong&gt; dans &lt;code&gt;/Applications&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Direction &lt;code&gt;/usr/local/bin&lt;/code&gt;, créer un script nommé &lt;code&gt;p4merge&lt;/code&gt; avec le contenu :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh

/Applications/p4merge.app/Contents/Resources/launchp4merge &amp;quot;$@&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rendre le script exécutable : &lt;code&gt;chmod +x p4merge&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 class="relative group"&gt;Configuration de git
 &lt;div id="configuration-de-git" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#configuration-de-git" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;[merge]
 conflictStyle = diff3
	tool = p4merge
[mergetool]
	keepBackup = false
	keepTemporaries = false
	prompt = false
&lt;/code&gt;&lt;/pre&gt;

&lt;h1 class="relative group"&gt;Utilisation
 &lt;div id="utilisation" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#utilisation" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;Et voilà, &lt;strong&gt;git difftool&lt;/strong&gt; et &lt;strong&gt;git mergetool&lt;/strong&gt; utiliseront maintenant P4Merge !
&lt;a href="https://jeanchristophegay.com/images/p4merge.png" &gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="P4Merge"
 src="https://jeanchristophegay.com/images/p4merge-mini.png"
 width="300"
 height="182"&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;</description></item><item><title>git-p4 au secours de Perforce</title><link>https://jeanchristophegay.com/posts/git-p4-au-secours-de-perforce/</link><pubDate>Sun, 18 Mar 2012 18:10:00 +0200</pubDate><guid>https://jeanchristophegay.com/posts/git-p4-au-secours-de-perforce/</guid><description>&lt;p&gt;A la manière d’un git-svn, il est possible d’utiliser git pour se synchroniser avec un dépôt Perforce (ouf). On peut profiter de la souplesse de git en local et continuer de travailler avec ses collègues sur le dépot central Perforce.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Principe de fonctionnement
 &lt;div id="principe-de-fonctionnement" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#principe-de-fonctionnement" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;Git-p4 permet de cloner un dépot Perforce dans un repository git.&lt;/p&gt;
&lt;p&gt;Le script va parcourir chaque révision des fichiers et peupler un répository git via la commande p4 print. On peut importer la totalité de l’historique, enfin si on a le temps surtout, le premier import peut-être assez long en fonction de la taille du dépot Perforce.&lt;/p&gt;
&lt;p&gt;La phase un peu plus compliquée est le report des changements dans Perforce (à cause des spécificités de ce SCM). Il faut pour celà passer par un workspace Perforce différent de l’emplacement du répository git.&lt;/p&gt;
&lt;p&gt;Les commits git sont alors reportés par le script dans le workspace Perforce via des git diff/format-patch… | git apply puis p4 submit s&amp;rsquo;occupe de transférer les changements dans Perforce.&lt;/p&gt;
&lt;p&gt;Git-p4 utilise git-notes sur chaque commit pour repérer ceux déjà synchroniser avec Perforce.&lt;/p&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Fonctionnement git-p4"
 src="https://jeanchristophegay.com/images/git-p4.png"
 width="732"
 height="304"&gt;&lt;/figure&gt;

&lt;h1 class="relative group"&gt;Installation
 &lt;div id="installation" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#installation" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;

&lt;h2 class="relative group"&gt;git
 &lt;div id="git" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#git" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Après l&amp;rsquo;installation classique des &lt;a href="http://git-scm.com/download" target="_blank" rel="noreferrer"&gt;binaires&lt;/a&gt;, on ajoute quelques propriétés spécifiques à git-p4 dans le fichier de configuration &lt;strong&gt;.gitconfig&lt;/strong&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[git-p4]
detectRename=true
detectCopy=true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Celà permettra à git-p4 de détecter les fichiers déplacés lors du submit dans Perforce (le copy ne semble pas utilisé&amp;hellip;).&lt;/p&gt;

&lt;h2 class="relative group"&gt;perforce
 &lt;div id="perforce" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#perforce" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Après l&amp;rsquo;installation des &lt;a href="http://www.perforce.com/product/components/perforce_visual_client" target="_blank" rel="noreferrer"&gt;binaires&lt;/a&gt;, exposer la variable d’environnement &lt;a href="http://www.perforce.com/perforce/doc.061/manuals/cmdref/env.P4CONFIG.html" target="_blank" rel="noreferrer"&gt;P4CONFIG&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Par la suite j’utilise un fichier &lt;strong&gt;.p4config&lt;/strong&gt; pour configurer les accès Perforce.&lt;/p&gt;

&lt;h2 class="relative group"&gt;python 2.x
 &lt;div id="python-2x" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#python-2x" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;git-p4 est écrit en python, &lt;a href="http://python.org/download/" target="_blank" rel="noreferrer"&gt;installation&lt;/a&gt;.&lt;/p&gt;

&lt;h2 class="relative group"&gt;git-p4
 &lt;div id="git-p4" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#git-p4" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/ermshiperete/git-p4" target="_blank" rel="noreferrer"&gt;Télécharger le script
&lt;/a&gt;Pour windows, créer le fichier &lt;em&gt;&lt;strong&gt;git-p4.bat&lt;/strong&gt;&lt;/em&gt; avec le contenu suivant:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@python &amp;quot;%~d0%~p0git-p4&amp;quot; %*&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Copier ces deux fichiers dans le répertoire d’installation de git &lt;em&gt;&lt;strong&gt;/libexec/git-core/&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2 class="relative group"&gt;Vérification de l&amp;rsquo;installation
 &lt;div id="vérification-de-linstallation" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#v%c3%a9rification-de-linstallation" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;p4 help
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git p4 help&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 class="relative group"&gt;Utilisation
 &lt;div id="utilisation" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#utilisation" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;

&lt;h2 class="relative group"&gt;Structure d’un projet
 &lt;div id="structure-dun-projet" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#structure-dun-projet" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Structure projet git-p4"
 src="https://jeanchristophegay.com/images/gitp4-projet.png"
 width="282"
 height="161"&gt;&lt;/figure&gt;
&lt;p&gt;Le dossier &lt;strong&gt;git&lt;/strong&gt; contiendra le repository git, et &lt;strong&gt;p4&lt;/strong&gt; le workspace Perforce.&lt;/p&gt;
&lt;p&gt;Contenu du fichier &lt;strong&gt;.p4config&lt;/strong&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;P4USER=nom d’utilisateur
P4PASSWD=mot de passe
P4CHARSET=encoding du serveur
P4COMMANDLINE=encoding du CLI
P4CLIENT=nom du workspace
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 class="relative group"&gt;Création du client Perforce
 &lt;div id="création-du-client-perforce" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#cr%c3%a9ation-du-client-perforce" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Dans le dossier &lt;strong&gt;p4&lt;/strong&gt;, utiliser la commande &lt;code&gt;p4 client&lt;/code&gt; pour créer un nouveau workspace. Les données du fichier &lt;em&gt;.p4config&lt;/em&gt; sont automatiquement utilisées, il suffit donc seulement de renseigner le mapping vers le projet.&lt;/p&gt;
&lt;p&gt;Penser à créer l’arborescence complète du mapping côté client avant de tenter votre premier commit.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Import initial du projet
 &lt;div id="import-initial-du-projet" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#import-initial-du-projet" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Dans le dossier &lt;strong&gt;git&lt;/strong&gt;, utiliser la commande &lt;code&gt;git p4 clone //depot/chemin/projet .&lt;/code&gt; (attention au point à la fin de la commande).&lt;/p&gt;
&lt;p&gt;Par défaut seule la dernière révision sera importée, pour importer l’historique complet il suffit de suffixer le chemin du dépôt par &lt;code&gt;@all&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Voilà on peut maintenant travailler dans le répository git !&lt;/p&gt;

&lt;h2 class="relative group"&gt;Mise à jour incrémentale
 &lt;div id="mise-à-jour-incrémentale" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#mise-%c3%a0-jour-incr%c3%a9mentale" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Une fois le premier import effectué, &lt;code&gt;git p4 rebase&lt;/code&gt; permet de récupérer les dernières changelist depuis Perforce.&lt;/p&gt;
&lt;p&gt;Pour ceux qui préfèrent voir les changements distants avant de les intégrer dans les commit locaux &lt;code&gt;git p4 sync&lt;/code&gt; puis &lt;code&gt;git rebase p4/master&lt;/code&gt;&lt;/p&gt;

&lt;h2 class="relative group"&gt;Report des changements locaux dans Perforce
 &lt;div id="report-des-changements-locaux-dans-perforce" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#report-des-changements-locaux-dans-perforce" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Penser à toujours faire un &lt;code&gt;git p4 rebase&lt;/code&gt; avant de soumettre les changements locaux dans Perforce sinon les possibles conflits devront être résolus depuis le workspace Perforce, et c&amp;rsquo;est quand même plus simple de les gérer dans git. En oubliant l&amp;rsquo;update avant le submit il est également possible de se retrouver avec des changelists Perforce non importées dans git (pas cool).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git p4 submit&lt;/code&gt; permet de reporter les changements sur le serveur Perforce.&lt;/p&gt;
&lt;p&gt;Utiliser l’option &lt;code&gt;--auto&lt;/code&gt; pour que Perforce ne demande pas de modifier le commentaire des commits. Il utilisera automatiquement ceux de git.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Précautions
 &lt;div id="précautions" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#pr%c3%a9cautions" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Comme lorsque l’on travaille uniquement avec git, ne pas réécrire l’historique de changements déjà synchroniser avec Perforce,&lt;/li&gt;
&lt;li&gt;Penser à toujours rebaser les modifications Perforce sur les changements locaux de git avant de tenter un submit,&lt;/li&gt;
&lt;li&gt;Éviter les merge entre branches locales, de toute façon il faudra rebaser les modifications au final. Celà pourrait amener à régler les mêmes conflits plusieurs fois.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;Workflow
 &lt;div id="workflow" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#workflow" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git p4 clone
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Modifier des fichiers
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Modifier des fichiers
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git p4 rebase
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git p4 submit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 class="relative group"&gt;Pour aller plus loin
 &lt;div id="pour-aller-plus-loin" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#pour-aller-plus-loin" aria-label="Ancre"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Utiliser le même répository git pour gérer plusieurs branches du dépot Perforce (Pour le moment j’utilise un repository git par branche),&lt;/li&gt;
&lt;li&gt;Repasser sur le script maintenu sur le repository git officiel, j’ai eu des problèmes sous windows avec ce dernier il y a quelques mois quand j’ai commencé à utiliser git-p4.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>