50 votes

Liste blanche .gitignore sur le répertoire et son contenu

J'essaie de mettre sur liste blanche le répertoire (et son contenu) SupplierName dans mon répertoire fournisseur de Zend Framework 2.

Le fichier .gitignore original dans /vendor ressemble à ceci :

# Add here the vendor path to be whitelisted
# Ex: for composer directory write here "!composer" (without quotes)
!.gitignore
*

J'aimerais maintenant mettre le répertoire SupplierName sur une liste blanche, ce qui ne devrait pas être trop difficile, ai-je pensé. J'ai lire la documentation sur gitignore et essayé les configurations suivantes :

Premier essai ajoutez !SupplierName juste après le commentaire qui dit que je dois ajouter le chemin d'accès à la liste blanche ici.

# Add here the vendor path to be whitelisted
!SupplierName
# Ex: for composer directory write here "!composer" (without quotes)
!.gitignore
*

Juste après, j'ai exécuté git status qui n'a pas montré le répertoire vendor/SupplierName. git add vendor/SupplierName a affiché le message suivant :

Les chemins suivants sont ignorés par l'un de vos fichiers .gitignore : vendor/SupplierName

Deuxième essai

# Add here the vendor path to be whitelisted
# Ex: for composer directory write here "!composer" (without quotes)
!SupplierName
!.gitignore
*

Juste après, j'ai exécuté git status qui n'a pas montré le répertoire vendor/SupplierName. git add vendor/SupplierName a affiché le message suivant :

Les chemins suivants sont ignorés par l'un de vos fichiers .gitignore : vendor/SupplierName

Troisième essai

# Add here the vendor path to be whitelisted
# Ex: for composer directory write here "!composer" (without quotes)
!.gitignore
*
!SupplierName

Juste après, j'ai exécuté git status qui n'a pas montré le répertoire vendor/SupplierName. git add vendor/SupplierName semble fonctionner . Mais maintenant, lorsque je veux ajouter le fichier Module.php (et d'autres fichiers, sous-répertoires, etc.), il se passe ce qui suit. git add vendor/SupplierName/Module.php -->

Les chemins suivants sont ignorés par l'un de vos fichiers .gitignore : vendor/SupplierName/Module.php

# Add here the vendor path to be whitelisted
# Ex: for composer directory write here "!composer" (without quotes)
*
!.gitignore
!SupplierName
!SupplierName/
!SupplierName/*

Permet d'ajouter des fichiers directement dans vendor/SupplierName, mais git add vendor/SupplierName/config/module.config.php entraîne toujours

Les chemins suivants sont ignorés par l'un de vos fichiers .gitignore : vendor/SupplierName/config/module.config.php

J'ai cherché des problèmes concernant la mise en liste blanche récursive, car cela semble être le problème, mais je n'ai rien trouvé.

54voto

Tuxdude Points 8652

Vous pouvez utiliser 2 .gitignore pour obtenir le résultat souhaité :

# vendor/.gitignore
*
!.gitignore
!SupplierName/
!SupplierName/*

# vendor/SupplierName/.gitignore
!*

Je l'ai testé avec un dépôt de test et il semble que cela fonctionne pour moi en ajoutant des fichiers à plusieurs niveaux de profondeur sous le dépôt de test. vendor/SupplierName répertoire.

$ git add .

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   vendor/.gitignore
#   new file:   vendor/SupplierName/.gitignore
#   new file:   vendor/SupplierName/a
#   new file:   vendor/SupplierName/b
#   new file:   vendor/SupplierName/c
#   new file:   vendor/SupplierName/d
#   new file:   vendor/SupplierName/dir1/d
#   new file:   vendor/SupplierName/dir1/dir4/dir5/dir6/dir7/dir8/dir9/dir10/somefile
#   new file:   vendor/SupplierName/dir1/dir4/f1
#   new file:   vendor/SupplierName/dir1/dir4/f2
#   new file:   vendor/SupplierName/dir1/dir4/f3
#   new file:   vendor/SupplierName/dir1/dir4/f4
#   new file:   vendor/SupplierName/dir1/e
#   new file:   vendor/SupplierName/dir1/f
#   new file:   vendor/SupplierName/dir3/dir6/f5
#   new file:   vendor/SupplierName/dir3/dir6/f6
#   new file:   vendor/SupplierName/dir3/dir6/f7
#   new file:   vendor/SupplierName/dir3/dir7/f8
#   new file:   vendor/SupplierName/e
#

18voto

Chronial Points 15402

Vous pouvez également obtenir ce résultat avec un seul .gitignore (dans la racine de votre projet) :

/*
!/.gitignore
!/vendor
/vendor/*
!/vendor/SupplierName

12voto

Simon Lang Points 122

J'ai trouvé un article intéressant : https://jasonstitt.com/gitignore-whitelisting-patterns

Tous les crédits à Jason Stitt. Les textes sont copiés du site ci-dessus :

Ignorer tout, puis ajouter des sous-arbres spécifiques

# Ignore everything
*
# But descend into directories
!*/
# Recursively allow files under subtree
!/subtree/**
# You can be specific with these rules
!/some/other/deep/path/**
!.gitignore 

El !*/ La règle désignera tous les répertoires. Mais Git ne suit pas les répertoires, seulement les fichiers, donc !*/ par lui-même ne fera que permettra seulement de descendre dans l'arborescence complète des répertoires ; il ne permettra en fait rien dans le repo. Avec cette règle en place, vous n'avez besoin que d'une seule règle ** joker récursif afin d'inclure un sous-arbre.

Si vous n'avez pas utilisé !*/ vous aurez besoin de règles supplémentaires pour ne pas ignorer /subtree/ et ses répertoires enfants.

Tout le monde n'aime pas !*/ car cela signifie que si une autre règle autorise un motif de nom de fichier trouvé dans un répertoire que vous ne voulez pas dans le repo, le répertoire lui-même ne sera pas bloqué. Vous devez utiliser des règles spécifiques pour les fichiers à inclure avec celle-ci.

Ignorez le répertoire racine, puis ajoutez des sous-arbres entiers.

# Ignore everything in the root
/*
# Un-ignore all of subtree
!/subtree/
!.gitignore 

Ce motif est un peu plus grossier que le précédent. Le site /* n'ignorera que les éléments se trouvant dans la racine du répertoire donc, dès que vous mettez un répertoire sur la liste blanche, tous les éléments de la structure de répertoire de tout le contenu du répertoire sera également autorisé, même sans utiliser la règle l'adresse * o ** des caractères de substitution.

Ignorer tout ce qui se trouve dans un répertoire, mais garder le répertoire vide

*
!.gitignore

Git ne veut pas inclure un répertoire vide dans un repo, parce qu'il suit les fichiers. Mettez un fichier caché (tel que .gitignore) dans le répertoire et il sera enregistré. Mais pour garder le répertoire vide, même même si vous y avez des fichiers à des fins de test/développement, c'est une bonne une bonne idée d'ignorer tout sauf le fichier .gitignore lui-même.

3voto

realhu Points 624

Vous devez d'abord inclure tout ce qui se trouve dans la liste noire, puis mettre tous les répertoires et sous-répertoires dans la liste blanche. Par exemple, je veux seulement mettre DIR /opt/source/ DIR /opt/nginx/ et FICHIER /home/test/.opt/hello.txt dans la liste blanche, on pourrait écrire .gitignore comme ça pour que ça marche :

/*
!/.gitignore
!/opt
/opt/*
!/opt/source/
!/opt/nginx/
!/home
/home/*
!/home/test
/home/test/*
!/home/test/.opt
/home/test/.opt/*
!/home/test/.opt/hello.txt

2voto

Goran Points 199

J'ai eu un problème similaire en passant de CVS à Git.

Contrairement à CVS, Git ne regarde pas les répertoires, il se concentre sur les fichiers.

Par exemple, vous ne pouvez pas ignorer le répertoire "a" mais vous pouvez ignorer tous les fichiers du répertoire "a" comme suit : !a/*

Il en va de même pour les sous-répertoires.

Si le répertoire "a" a un sous-répertoire "b" et que vous ignorez "!a/*", vous obtiendrez quand même tous les fichiers de "a/b".

Vous devez donc également ignorer "!a/b/*" et ainsi de suite pour tous les sous-répertoires que vous souhaitez mettre en liste blanche.

Vous n'avez besoin que d'un seul fichier .gitignore.

donc vous vous retrouvez avec quelque chose comme :

# ignore everything
*
# except for .gitignore files in the current directory
!.gitignore
# and all files in directory a
!a/*
#and all files in subdirectory b
!a/b/*

Ainsi, vous obtiendrez toujours les fichiers de a/c et a/b/c. Je ne suis pas sûr qu'il existe une solution pour la récursion dans les sous-répertoires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X