J'ai l'arborescence de répertoires suivante:
> #pwd is the repo
> tree -a
.
├── .git
│ |.....
├── .gitignore
├── README.md
├── f1.html
├── f2.html ... and some more html
├── images
│ └── river.jpg
>
J'ai également ce qui suit dans mon .gitignore
:
> cat .gitignore
*
!*.html
!images/*.*
>
Je souhaite que tous les fichiers du répertoire images soient inclus dans le repo. Mais cela ne se produit pas. Je l'ai fait fonctionner en utilisant ce qui suit dans gitignore:
*
!*.html
!images*
!*.jp*g
Que se passe-t-il ici? Existe-t-il un moyen infaillible de tester gitignore. J'ai vérifié le documentation . Voici le point qu'il ne comprend pas (c'est sous l'en-tête format de modèle ):
Sinon, Git traite le modèle comme un glob Shell pouvant être consommé par fnmatch (3) avec l'indicateur FNM_PATHNAME: les caractères génériques dans le modèle ne correspondront pas à un/dans le chemin. Par exemple, "Documentation/*. Html" correspond à "Documentation/git.html" mais pas à "Documentation/ppc/ppc.html" ou "tools/perf/Documentation/perf.html".
Tout d'abord, la partie délicate de votre question est la première ligne du .gitignore
fichier:
* // Says exclude each and every file in the repository,
// unless I specify with ! pattern explicitly to consider it
Nous allons d'abord considérer la première version de votre .gitignore
.
*
exclut tous les fichiers du référentiel.!*.html
autorise tous les fichiers html.!images/*.*
considérez tous les types de fichiers dans le dossier images.Pour inclure tous les JPG/JPEG, vous auriez pu simplement ajouter !*.jp*g
à la 3ème ligne, ce qui aurait permis à git de considérer tous les jpg et jpeg quel que soit le dossier où se trouve ce fichier. Mais vous vouliez spécifiquement uniquement à partir du dossier images et pas seulement jpg, tout type de fichier dans le dossier images. Lisons la documentation qui s'y rapporte et dans la 3ème section nous irons à la partie solution.
Git ignore pattern concernant la prise en compte du dossier:
Motif se terminant uniquement par une barre oblique : si un motif se termine par <dir-name>/
alors git ignorera les fichiers contenus dans ce répertoire et tous les autres sous-répertoires. Comme exemple donné dans la documentation
foo/
correspondra à un répertoire foo et aux chemins en dessous, mais ne correspondra pas à un fichier standard ou à un lien symbolique foo
mais notez également que si un modèle correspond à un fichier dans le répertoire exclu, git ne le considère pas.
Le motif n'a pas de barre oblique : Si vous spécifiez le nom du répertoire dans la liste des ignorés qui ne se termine pas par une barre oblique, git le considérera comme un simple , qui peut correspondre à n'importe quel fichier ayant ce chemin.
Si le modèle ne contient pas de barre oblique /, Git le traite comme un modèle global de shell et vérifie une correspondance avec le chemin d'accès par rapport à l'emplacement
Motif avec barre oblique et caractère spécial (* /?) : Si le motif se termine comme le 1er exemple que vous avez donné, images/*.*
Il fonctionne comme spécifié dans la documentation
Exemple: "Documentation/*. Html" correspond à "Documentation/git.html" mais pas à "Documentation/ppc/ppc.html" ou "tools/perf/Documentation/perf.html".
En considérant le 3ème point, git devrait considérer tous les fichiers du répertoire images pour !images/*.*
modèle. Mais il ne le fait pas parce que la documentation dit un point plus important
Git ne répertorie pas les répertoires exclus
En raison de la première ligne *
le répertoire "images" lui-même est ignoré. Donc, nous devons d'abord dire au git de considérer le répertoire des images et plus tard les lignes supplémentaires pour dire explicitement considérer les autres types (si nécessaire).
*
!*.html
!images/ // <- consider images folder
!images/*.*
Remarque : la dernière ligne prend en compte tous les types de fichiers uniquement à partir du répertoire images et non de ses sous-répertoires. (3e point de la section 2)