<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="https://ktherage.github.io/fr/xsl/atom.xsl" media="all"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
  <id>https://ktherage.github.io/fr/tags/git/</id>
  <title>Kévin THÉRAGE | Expert Symfony Developer - Git</title>
  <subtitle><![CDATA[Kévin THÉRAGE – Expert Symfony Developer. Technical blog on Symfony, PHP, web development with tutorials, best practices and expert advice for developers.]]></subtitle>
  <link href="https://ktherage.github.io/fr/tags/git/atom.xml" rel="self" type="application/atom+xml" />
  <link href="https://ktherage.github.io/fr/tags/git/" rel="alternate" type="text/html" />
  <updated>2026-06-08T09:33:13+00:00</updated>
  <author>
    <name>Kévin THÉRAGE</name>
    <uri>https://ktherage.github.io/</uri>
  </author>
  <entry xml:lang="fr">
    <id>https://ktherage.github.io/fr/blog/gitignore-blacklisting-whitelisting/</id>
    <title>Déboguer le .gitignore de Git : Pourquoi la liste blanche dans les sous-répertoires échoue</title>
    <published>2026-03-25T00:00:00+00:00</published>
    <link href="https://ktherage.github.io/fr/blog/gitignore-blacklisting-whitelisting/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<h2 id="introduction">Introduction</h2>
<p>Lorsque vous travaillez avec Git, il est courant d'utiliser <code translate="no">.gitignore</code> pour exclure des fichiers et des répertoires. Mais parfois, même des règles bien intentionnées peuvent conduire à un comportement inattendu — en particulier lorsqu'il s'agit de répertoires imbriqués. Dans cet article, je vais vous présenter un exemple concret d'une règle <code translate="no">.gitignore</code> destinée à garder un projet propre qui a fini par cacher des fichiers importants, et comment nous l'avons corrigée.</p>
<hr>
<h2 id="la-configuration">La configuration</h2>
<p>Je voulais garder le répertoire <code translate="no">.tools/</code> propre, en ne suivant que <code translate="no">composer.json</code>, <code translate="no">composer.lock</code> et le fichier <code translate="no">.gitignore</code> lui-même. Mon <code translate="no">.tools/.gitignore</code> initial ressemblait à ceci :</p>
<pre><code class="language-gitignore" translate="no">*
!.gitignore
!composer.json
!composer.lock</code></pre>
<p>Objectif : Ne suivre que composer.json, composer.lock et .gitignore dans .tools/ et ses sous-répertoires, en ignorant tout le reste.</p>
<hr>
<h2 id="le-probleme">Le problème</h2>
<p>Après avoir poussé ce changement, un collègue a signalé que son fichier composer.lock dans <code translate="no">.tools/rector/</code> était ignoré. Nous avons utilisé la commande suivante pour déboguer :</p>
<pre><code class="language-bash hljs bash" translate="no">$ git check-ignore -v .tools/rector/composer.lock
.tools/.gitignore:1:*     .tools/rector/composer.lock</code></pre>
<hr>
<h2 id="cause-racine">Cause racine</h2>
<p>La règle de Git : <em>« Il n'est pas possible de ré-inclure un fichier si un répertoire parent de ce fichier est exclu. »</em></p>
<p>Le motif <code translate="no">*</code> ignore à la fois les fichiers et les répertoires, ce qui signifie que Git ne regarde jamais à l'intérieur de <code translate="no">.tools/rector/</code> — donc les règles de liste blanche pour <code translate="no">composer.json</code> et <code translate="no">composer.lock</code> ne s'appliquent jamais.</p>
<hr>
<h2 id="la-solution">La solution</h2>
<p>Après débogage, nous avons mis à jour le <code translate="no">.gitignore</code> pour permettre explicitement la traversée des répertoires et ré-inclure les fichiers nécessaires :</p>
<pre><code class="language-gitignore" translate="no"># Ignore all files and directories at this level
*

# But allow Git to inspect subdirectories
!*/

# Explicitly ignore vendor directories
vendor

# Whitelist composer.json in any subdirectory
!*/composer.json

# Whitelist composer.lock in any subdirectory
!*/composer.lock

# Always keep this .gitignore file
!.gitignore</code></pre>
<hr>
<h2 id="points-cles-a-retenir">Points clés à retenir</h2>
<table>
<thead>
<tr>
<th>Répertoire/Fichier</th>
<th>Règle appliquée</th>
<th>Résultat</th>
</tr>
</thead>
<tbody>
<tr>
<td>.tools/</td>
<td><code translate="no">*</code></td>
<td>Ignoré</td>
</tr>
<tr>
<td>.tools/rector/</td>
<td><code translate="no">!*/</code></td>
<td>Inspecté</td>
</tr>
<tr>
<td>.tools/rector/vendor</td>
<td><code translate="no">vendor</code></td>
<td>Ignoré</td>
</tr>
<tr>
<td>.tools/rector/composer.json</td>
<td><code translate="no">!*/composer.json</code></td>
<td>Suivi</td>
</tr>
</tbody>
</table>
<ul>
<li><strong>La traversée des répertoires par Git :</strong> Lorsque vous utilisez <code translate="no">*</code> pour tout ignorer, Git ne regardera pas à l'intérieur des répertoires sauf si vous l'autorisez explicitement avec <code translate="no">!*/</code>.</li>
<li><strong>Tester vos règles :</strong> Testez toujours votre <code translate="no">.gitignore</code> avec <code translate="no">git check-ignore -v &lt;fichier&gt;</code> et <code translate="no">git status</code> pour vous assurer que les fichiers attendus sont suivis.</li>
<li><strong>L'ordre a son importance :</strong> Placez les exclusions générales en premier, puis ré-incluez les fichiers ou répertoires spécifiques.</li>
<li><strong>Pièges courants :</strong> N'oubliez pas de ré-exclure les répertoires comme <code translate="no">vendor</code> après la mise en liste blanche, sinon ils seront inclus dans votre dépôt.</li>
</ul>
<hr>
<h2 id="conclusion">Conclusion</h2>
<p>Déboguer les problèmes de <code translate="no">.gitignore</code> peut être délicat, mais comprendre comment Git évalue la traversée des répertoires et la correspondance des motifs rend les choses beaucoup plus faciles. Testez toujours vos règles avec des répertoires imbriqués avant de commiter, et n'hésitez pas à utiliser <code translate="no">git check-ignore</code> pour vérifier votre configuration.</p>]]>
    </content>
  </entry>
</feed>
