<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Git-P4 on Jean-Christophe Gay</title><link>https://jeanchristophegay.com/tags/git-p4/</link><description>Recent content in Git-P4 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-p4/index.xml" rel="self" type="application/rss+xml"/><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>