- Les règles d’ignorance de fichiers de Git se répartissent en trois niveaux selon leur portée de partage :
.gitignore, .git/info/exclude et ~/.config/git/ignore
- Comme
.gitignore est committé avec le code du dépôt, c’est l’endroit où placer les règles partagées que l’équipe ou le projet doivent appliquer ensemble
- Pour des éléments comme des fichiers personnels ou des fichiers de travail locaux, utiles dans le dépôt mais difficiles à formaliser comme règle d’équipe, il est plus approprié d’utiliser
.git/info/exclude
- Les fichiers à exclure de façon répétée dans tous les dépôts, comme
.DS_Store sur macOS, peuvent être placés dans ~/.config/git/ignore, le fichier d’ignore global à la machine
git check-ignore -v <nom_du_fichier> est utile pour identifier quelle règle ignore un fichier, et s’il n’existe aucune règle correspondante, la commande n’affiche rien
Où s’appliquent les règles d’ignore de Git
- Git peut gérer les règles d’ignorance de fichiers à trois emplacements
.gitignore
.git/info/exclude
~/.config/git/ignore
.gitignore : les règles partagées committées dans le dépôt
.gitignore est le fichier habituel dans lequel on écrit les noms des fichiers à ignorer
- Il est check-in dans Git avec le reste du code
- Les fichiers qui correspondent aux règles de
.gitignore ne sont pas pris en compte lors de l’exécution des commandes git
.git/info/exclude : les règles personnelles propres à un dépôt
- Le fichier
exclude se trouve dans le répertoire .git de chaque dépôt Git
- Les modifications de ce fichier ne sont pas check-in dans Git
- Dans un nouveau dépôt Git, il contient généralement quelques lignes de commentaires
- Il convient aux fichiers que l’on veut ignorer uniquement pour un dépôt donné, sans les ajouter à
.gitignore
- Exemple : si vous ne voulez pas committer dans le dépôt un
notes.txt nécessaire uniquement à votre workflow personnel, ni l’ajouter au .gitignore du projet, vous pouvez ajouter notes.txt à .git/info/exclude
~/.config/git/ignore : les règles globales de la machine
- Le fichier
ignore global se trouve dans ~/.config/git/ignore, dans le répertoire personnel
- Les noms de fichiers ajoutés ici sont ignorés globalement au niveau de la machine
- Il n’est pas check-in dans Git et n’est lié à aucun dépôt en particulier
- C’est l’endroit idéal pour placer les fichiers que vous souhaitez ignorer dans tous les dépôts Git de votre ordinateur
- Exemple : sur macOS, il est pertinent d’y ajouter
.DS_Store
Changer le chemin du fichier d’ignore global
- Le fichier d’ignore global peut être redirigé vers un autre fichier
- Pour utiliser
.gitignore_global comme fichier d’ignore Git global, exécutez la commande suivante
git config --global core.excludesFile ~/.gitignore_global
- Pour revenir au paramétrage par défaut, exécutez la commande suivante
git config --global --unset core.excludesFile
Vérifier quelle règle ignore un fichier
- Avec
git check-ignore -v <nom_du_fichier>, vous pouvez vérifier par quelle règle un fichier donné est ignoré
- Pour voir comment
.DS_Store est ignoré, exécutez la commande suivante dans un dépôt Git
git check-ignore -v .DS_Store
- Si le
.gitignore du dépôt ignore .DS_Store, voici un exemple de sortie
$ git check-ignore -v .DS_Store
.gitignore:1:.DS_Store .DS_Store
- Si le
.git/info/exclude du dépôt ignore .DS_Store, voici un exemple de sortie
$ git check-ignore -v .DS_Store
.git/info/exclude:7:.DS_Store .DS_Store
- Si le fichier global
~/.config/git/ignore ignore .DS_Store, voici un exemple de sortie
$ git check-ignore -v .DS_Store
/Users/nelson/.config/git/ignore:2:.DS_Store .DS_Store
- Si le fichier d’ignore global personnalisé
.gitignore_global ignore .DS_Store, voici un exemple de sortie
$ git check-ignore -v .DS_Store
/Users/nelson/.gitignore_global:1:.DS_Store .DS_Store
- S’il n’existe aucune règle qui ignore un fichier donné, la commande
git check-ignore -v n’affiche absolument rien
3 commentaires
Il pourrait aussi être utile de mettre des éléments comme le spec de travail ou le fichier
plan.mddans.git/info/exclude.Ah, donc il y avait aussi un réglage à la racine haha
Commentaires Hacker News
Article intéressant, mais il manque ma fonctionnalité Git préférée de quasi-ignorance :
.gitattributesCe fichier permet d’indiquer à Git d’« ignorer » les différences de certains fichiers. Par exemple, dans un projet Node,
package-lock.jsonressemble presque à du bruit du point de vue de Git. On n’y voit que d’énormes diffs avec les versions précises des bibliothèques, alors que les informations de version réellement lisibles par un humain se trouvent séparément danspackage.jsonEn ajoutant une ligne
package-lock.json -diffdans le.gitattributesà la racine du projet, le fichier continue d’être indexé et commit, maisgit diffn’affiche plus ces énormes différences sans intérêtpackage-lock.jsonne devrait pas être du bruit. Si on ne cherche pas volontairement à le mettre à jour, il ne devrait pas changer ; sinon on s’expose sans raison à un risque de supply chainSi des changements dans
package-lock.jsonapparaissent souvent de façon inattendue, c’est qu’il y a un problèmepackage-lock.jsonmontre toutes les dépendances transitives, alors quepackage.jsonne montre que les dépendances directes. Dire que ce dernier contient les « vraies versions lisibles par un humain » n’est pas exactLes deux n’ont pas le même rôle, et dire qu’on peut toujours ignorer les diffs du fichier de verrouillage est dangereux
git diffne montrait pas les diffs du fichier de verrouillageJe comprends que cela puisse ressembler à du bruit ligne par ligne, mais quand on en a besoin, c’est indispensable
Les règles d’exclusion globales / par utilisateur devraient être bien plus connues. Je reçois souvent des changements qui veulent ajouter dans le
.gitignorede tous les projets des fichiers liés à l’IDE, à l’OS ou à l’IA ; quand on explique qu’on peut les mettre dans une configuration standard pour qu’ils soient ignorés partout, sans toucher à chaque projet, et sans risquer de les commit par erreur dans les projets dont le.gitignoren’a pas été mis à jour, la plupart des gens apprécientMa règle personnelle est d’utiliser le
.gitignoredu dépôt uniquement pour les éléments propres au dépôt, comme les artefacts de build ou les dossiers de dépendances, et de laisser la plupart des outils utilisateur dans la configuration de chacun.gitignoreglobal est justement la conséquence naturelle de ce principe selon lequel le.gitignoredu dépôt ne doit servir qu’aux éléments propres au dépôtPour faire perdre moins de temps à tout le monde, il vaut mieux simplement mettre ce genre de fichiers dans le
.gitignorede tous les projets.gitignoredu projet pour éviter que quelqu’un les ajoute au projet par ignoranceOn finirait de toute façon par les retirer de Git, et cette personne en souffrirait, donc c’était une manière préventive d’être aimable. Je serai peut-être moins aimable à l’avenir
gitignore, parce qu’elle survit même à la reconstruction d’un conteneur de développementS’il faut éviter
gitignore, on peut certes restaurer ou conserver la configuration avec un script de génération ou un volume, mais cela impose un script supplémentaire ou une configuration de montagedevcontainerau lieu d’une simple ligne dans.gitignorePour la configuration Git globale et les fichiers d’ignore, je pense qu’il vaut mieux utiliser
~/.config/git/ignoreet~/.config/git/configque créer~/.gitignore_globalet modifier la configurationSi on utilise
~/.config/pour plusieurs usages, cela réduit fortement le nombre de dotfiles à la racineSi Git exclude est moins utilisé, c’est parce qu’il n’est pas commit dans le dépôt, donc il faut le recréer chaque fois qu’on veut s’en servir. Ce n’est pas pour dire que c’est mauvais, seulement pour expliquer pourquoi c’est moins utilisé
~/.config, vous pouvez ensuite modifier et partager ces fichiers plus facilement~/.cvsignorepour d’autres outils qui lisent le même fichierJe ne sais plus où j’ai appris ça, mais j’ai ajouté
atticà mon ignore Git globalÇa permet de créer dans n’importe quel projet un répertoire
atticpour y stocker divers éléments qui ne devraient jamais être commit. Je n’ai encore jamais vu de dépôt qui vérifie réellement l’existence d’un tel répertoireS’il y a un répertoire comme
attic, on peut créerattic/.gitignoreavec/**dedans ; ainsi, ce répertoire et tout ce qu’il contient sont ignorés, y compris le fichier ignore lui-mêmeEn général, je donne à ma version de ce répertoire un nom d’un seul caractère, U+1F4A9, mais HN n’autorise pas son insertion dans les commentaires
auxJ’y mets un
.gitignorene contenant qu’une étoile*, ce qui masque le dossier lui-même et tout son contenu.localscratch/Jusqu’ici, ça ne m’a encore jamais causé de problème
Concernant les ignores par utilisateur, sur macOS, on dit souvent qu’il est idéal d’y ajouter
.DS_Store, mais il faut alors que tous les utilisateurs Mac du projet le fassentS’il y en a plus d’un ou deux, il peut être préférable de ne pas laisser cela à la charge de chacun
~/.gitignore_globalavec une entrée.DS_Store, et la configuration Git globale contient aussi le paramètre pour ignorer les entrées de ce fichierSur le Mac récent, la date du fichier est antérieure de deux jours à la commande, et je ne me souviens pas l’avoir configuré moi-même, donc j’ai l’impression que cela était fourni par défaut. L’ancien Mac devait probablement être similaire, et vu les versions de macOS, c’est peut-être le comportement par défaut depuis assez longtemps
Il est donc possible que l’époque où il fallait ajouter
.DS_Store/au.gitignoresoit désormais révolueWaouh, comment ai-je pu passer à côté de ça ? Je suis développeur logiciel professionnel depuis 20 ans et je n’ai utilisé que
.gitignoreJe réalise que je ne me suis même jamais demandé s’il existait une meilleure manière d’éviter d’encombrer
.gitignoreavec toutes sortes d’exclusions qui ne concernent que moi. J’acceptais simplement le monde tel qu’il se présentaitAujourd’hui, le monde va un peu mieux
J’utilise énormément
.git/info/exclude. C’est parfait pour des scripts /Makefileutilisés seulement en local et dont les collaborateurs n’ont ni besoin ni même la possibilité de se servir.git/info/excludetous les fichiers non suivis affichés pargit statusEn général, je l’applique après avoir fait les
addetcommitde tout ce que je veux réellement mettre dans le dépôtJ’utilise aussi des fichiers excludes de cette manière pour appliquer une configuration Git au niveau du projet différente dans un répertoire de projet contenant plusieurs dépôts
https://laszlo.nu/blog/project-level-git-config.html
Voici quelques alias liés que j’utilise
assume = update-index --assume-unchangedunassume = update-index --no-assume-unchangedassumed = "!git ls-files -v | grep ^h | cut -c 3-"unassumeall = "!git assumed | xargs git update-index --no-assume-unchanged"assumeall = "!git st -s | awk {'print $2'} | xargs git assume"Pour les fichiers déjà suivis, il y a aussi
git update-index --[no]-skip-worktreeÇa peut être utile pour des expérimentations locales, mais comme Git ne met pas vraiment cette fonctionnalité en avant, c’est un peu pénible à utiliser. Il faut se souvenir qu’on l’a activée, et si on l’oublie, cela peut bloquer d’autres opérations comme un checkout