Quelle est la syntaxe appropriée pour que le .gitignore
fichier ignore les fichiers d'un répertoire?
Serait-ce
config/databases.yml
cache/*
log/*
data/sql/*
lib/filter/base/*
lib/form/base/*
lib/model/map/*
lib/model/om/*
ou
/config/databases.yml
/cache/*
/log/*
/data/sql/*
/lib/filter/base/*
/lib/form/base/*
/lib/model/map/*
/lib/model/om/*
?
.gitignore
différence entre les fichiers et les répertoires qu'il ignore? par exemple,data
vsdata/
signifie-t-il des choses différentes?data
ignorera les fichiers et répertoires qui correspondent,data/
ignorera uniquement les répertoires qui correspondent.Réponses:
FORMAT DE MODÈLE
Une ligne vierge ne correspond à aucun fichier, elle peut donc servir de séparateur pour la lisibilité.
Une ligne commençant par
#
sert de commentaire.Un préfixe facultatif
!
qui annule le modèle; tout fichier correspondant exclu par un modèle précédent sera à nouveau inclus. Si un modèle annulé correspond, cela remplacera les sources de modèles de priorité inférieure.Si le modèle se termine par une barre oblique, il est supprimé aux fins de la description suivante, mais il ne trouve une correspondance qu'avec un répertoire. En d'autres termes,
foo/
correspondra à un répertoirefoo
et aux chemins en dessous, mais ne correspondra pas à un fichier normal ou à un lien symboliquefoo
(cela est cohérent avec la façon dont pathspec fonctionne en général dans git).Si le modèle ne contient pas de barre oblique
/
, git le traite comme un modèle de glob de shell et vérifie une correspondance avec le chemin d'accès par rapport à l'emplacement du.gitignore
fichier (par rapport au niveau supérieur de l'arborescence de travail s'il ne provient pas d'un.gitignore
fichier).Sinon, git traite le modèle comme un glob de shell adapté à la consommation
fnmatch(3)
avec leFNM_PATHNAME
drapeau: les caractères génériques dans le modèle ne correspondront pas à a/
dans le chemin d'accès. Par exemple,Documentation/*.html
correspondDocumentation/git.html
mais pasDocumentation/ppc/ppc.html
outools/perf/Documentation/perf.html
.Une barre oblique correspond au début du chemin d'accès. Par exemple,
/*.c
correspondcat-file.c
mais pasmozilla-sha1/sha1.c
.Vous pouvez en trouver plus ici
git help gitignore
ou
man gitignore
la source
man
page ou un document officiel est le meilleur format pour SO ...Ce serait le premier. Utilisez également les extensions au lieu de la structure des dossiers.
Par exemple, mon exemple de développement C # ignore le fichier:
Mise à jour
Je pensais fournir une mise à jour à partir des commentaires ci-dessous. Bien qu'il ne réponde pas directement à la question de l'OP, consultez ce qui suit pour plus d'exemples de
.gitignore
syntaxe.Wiki de la communauté (constamment mis à jour):
.gitignore pour les projets et solutions Visual Studio
Vous trouverez plus d'exemples d'utilisation d'une langue spécifique ici (grâce au commentaire de Chris McKnight):
https://github.com/github/gitignore
la source
range
. Cela correspond donc*.Obj
aussi bien*.obj
.Les chemins qui contiennent des barres obliques sont considérés comme relatifs au répertoire contenant le fichier .gitignore - généralement le niveau supérieur de votre référentiel, mais vous pouvez également les placer dans des sous-répertoires.
Donc, puisque dans tous les exemples que vous donnez, les chemins contiennent des barres obliques, les deux versions sont identiques. Le seul moment où vous devez mettre une barre oblique est quand il n'y en a pas déjà sur le chemin. Par exemple, pour ignorer foo uniquement au niveau supérieur du référentiel, utilisez
/foo
. Une simple écriturefoo
ignorerait tout ce qui s'appelle foo n'importe où dans le référentiel.Vos caractères génériques sont également redondants. Si vous voulez ignorer un répertoire entier, nommez-le simplement:
La seule raison d'utiliser des caractères génériques comme vous l'avez fait si vous avez l'intention de dés-ignorer ultérieurement quelque chose dans le répertoire:
la source
Une barre oblique principale indique que l'entrée ignorer doit uniquement être valide par rapport au répertoire dans lequel réside le fichier .gitignore. La spécification
*.o
ignorerait tous les fichiers .o dans ce répertoire et tous les sous-répertoires, tout en les/*.o
ignorant simplement dans ce répertoire, tandis que là encore,/foo/*.o
ils ne les ignoreraient que dans /foo/*.o.la source
Si vous souhaitez placer un fichier .gitignore au niveau supérieur et le faire fonctionner pour n'importe quel dossier en dessous, utilisez-le
/**/
.Par exemple, pour ignorer tous les
*.map
fichiers d'un/src/main/
dossier et des sous-dossiers, utilisez:la source
**
. Un me suffisait.Les deux exemples de la question sont en fait de très mauvais exemples qui peuvent entraîner une perte de données!
Mon conseil: ne jamais ajouter
/*
aux répertoires dans des fichiers .gitignore, sauf si vous avez une bonne raison!Une bonne raison serait par exemple ce que Jefromi a écrit: "si vous avez l'intention de dés-ignorer ultérieurement quelque chose dans le répertoire" .
La raison pour laquelle cela ne devrait pas être fait autrement est que l'ajout
/*
aux répertoires fonctionne d'une part de la manière qu'il ignore correctement tout le contenu du répertoire, mais d'autre part, il a un effet secondaire dangereux:Si vous exécutez
git stash -u
(pour cacher temporairement les fichiers suivis et non suivis) ougit clean -df
(pour supprimer les fichiers non suivis mais gardez les fichiers ignorés) dans votre référentiel, tous les répertoires qui sont ignorés avec un ajout/*
seront irréversiblement supprimés !Quelques antécédents
J'ai dû l'apprendre à la dure. Quelqu'un dans mon équipe ajoutait
/*
à certains répertoires de notre .gitignore. Au fil du temps, j'ai eu des occasions où certains répertoires disparaissaient soudainement. Répertoires contenant des gigaoctets de données locales nécessaires à notre application. Personne ne pouvait l'expliquer et je déteste toujours télécharger à nouveau toutes les données. Après un certain temps, j'ai eu une idée que cela pourrait avoir à voir avecgit stash
. Un jour, je voulais nettoyer mon dépôt local (tout en gardant les fichiers ignorés) et j'utilisaisgit clean -df
et encore mes données avaient disparu. Cette fois, j'en ai eu assez et j'ai enquêté sur le problème. J'ai finalement pensé que la raison en était l'annexe/*
.Je suppose que cela peut s'expliquer d'une manière ou d'une autre par le fait qu'il
directory/*
ignore tout le contenu du répertoire mais pas le répertoire lui-même. Ainsi, il n'est ni considéré comme suivi ni ignoré lorsque les choses sont supprimées. Même sigit status
etgit status --ignored
donnez une image légèrement différente à ce sujet.Comment se reproduire
Voici comment reproduire le comportement. J'utilise actuellement Git 2.8.4.
Un répertoire appelé
localdata/
avec un fichier factice (important.dat
) sera créé dans un dépôt git local et le contenu sera ignoré en le mettant/localdata/*
dans le.gitignore
fichier. Lorsque l'une des deux commandes git mentionnées est exécutée maintenant, le répertoire sera (de manière inattendue) perdu.Si vous faites un
git status --ignored
ici, vous obtiendrez:Maintenant non plus
ou
Dans les deux cas, le répertoire prétendument ignoré
localdata
disparaîtra!Je ne sais pas si cela peut être considéré comme un bug, mais je suppose que c'est au moins une fonctionnalité dont personne n'a besoin.
Je vais signaler cela à la liste de développement git et voir ce qu'ils en pensent.
la source
Ce serait:
ou peut-être même:
au cas où
filter
et ceform
sont les seuls répertoires de la lib qui ont unbase
sous-répertoire qui doit être ignoré (voyez-le comme un exemple de ce que vous pouvez faire avec les astérisques).la source
Le premier. Ces chemins d'accès aux fichiers sont relatifs par rapport à l'emplacement de votre fichier .gitignore.
la source
Je maintiens un service basé sur l'interface graphique et CLI qui vous permet de générer
.gitignore
très facilement des modèles sur https://www.gitignore.io .Vous pouvez soit saisir les modèles souhaités dans le champ de recherche, soit installer l'alias de ligne de commande et exécuter
$ gi swift,osx
la source
Un exemple de fichier .gitignore peut ressembler à celui ci-dessous pour un projet Android Studio
la source