Comment puis-je ignorer les fichiers d'un répertoire dans Git?
Quelle est la syntaxe appropriée pour que le fichier .gitignore
ignore les fichiers d'un répertoire?
Serait-il
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/*
?
10 réponses
PATTERN FORMAT
-
une ligne vide 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 de correspondance exclu par un modèle précédent sera de nouveau inclus. Si un motif négatif correspond, il supplantera les sources des motifs de priorité inférieure. -
si le motif se termine par une barre oblique, elle est supprimée aux fins de la description suivante, mais elle ne trouvera qu'une correspondance avec un répertoire. En d'autres termes,
foo/
correspondra à un répertoirefoo
et à des chemins sous celui-ci, mais ne correspondra pas à un fichier régulier ou à un lien symboliquefoo
(ceci est cohérent avec la façon dont pathspec fonctionne dans général dans git). -
si le pattern ne contient pas de slash
/
, git le traite comme un pattern glob de shell et vérifie une correspondance avec le nom de chemin relatif à l'emplacement du fichier.gitignore
(relatif au niveau supérieur de l'arbre de travail si ce n'est pas à partir d'un fichier.gitignore
). -
dans les autres cas, git traite le modèle comme une noix de grenaille propre à la consommation par
fnmatch(3)
avec le DrapeauFNM_PATHNAME
: les caractères génériques dans le motif ne correspondront pas à un/
dans le nom de chemin. Par exemple,Documentation/*.html
correspond àDocumentation/git.html
mais pas àDocumentation/ppc/ppc.html
outools/perf/Documentation/perf.html
. -
une barre oblique correspond au début du chemin d'accès. Par exemple,
/*.c
correspond àcat-file.c
mais pas àmozilla-sha1/sha1.c
.
vous pouvez en savoir plus ici
git help gitignore
ou
man gitignore
ce serait la première. Allez par extensions aussi bien au lieu de la structure de dossier.
i. e. mon exemple C # développement ignorer fichier:
#OS junk files
[Tt]humbs.db
*.DS_Store
#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad
#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*
#Project files
[Bb]uild/
#Subversion files
.svn
# Office Temp Files
~$*
mise à Jour
j'ai pensé que je pourrais fournir une mise à jour à partir des commentaires ci-dessous. Bien que ne répondant pas directement à la question de L'OP, voir la suite pour plus d'exemples de syntaxe .gitignore
.
wiki communautaire (être constamment mis à jour):
.gitignore pour les Projets Visual Studio et Solutions
D'autres exemples d'utilisation spécifique de la langue sont disponibles ici (grâce au commentaire de Chris McKnight):
les chemins qui contiennent des slashes sont considérés comme relatifs au répertoire contenant le .gitignore fichier-généralement le niveau supérieur de votre dépôt, bien que vous pouvez également les placer dans des sous-répertoires.
donc, puisque dans tous les exemples que vous donnez, les chemins contiennent des slashes, les deux versions sont identiques. La seule fois où vous avez besoin de mettre une barre oblique est quand il n'est pas un dans le chemin déjà. Par exemple, pour ignorer foo seulement au sommet niveau du dépôt, utilisez /foo
. Simplement écrire foo
ignorerait tout ce qui s'appelle foo n'importe où dans le dépôt.
vos jokers sont également redondants. Si vous voulez ignorer un répertoire entier, il vous suffit de le nommer:
lib/model/om
la seule raison d'utiliser les caractères génériques comme vous l'avez fait est si vous avez l'intention de supprimer par la suite quelque chose dans le répertoire:
lib/model/om/* # ignore everything in the directory
!lib/model/om/foo # except foo
Un slash indique que l'ignorer est uniquement valables à l'égard du répertoire dans lequel le .le dossier gitignore réside. Spécifier *.o
ignorerait tout .o les fichiers de ce répertoire et de tous les sous-répertoires, alors que /*.o
les ignorerait dans ce répertoire, alors que /foo/*.o
ne les ignorerait que dans /foo/*.O.
Si vous voulez mettre une .gitignore fichier au plus haut niveau et le faire fonctionner pour n'importe quel dossier en dessous de /**/
.
E. G. pour ignorer tous les *.map
fichiers dans un /src/main/
dossier et sous-dossiers utiliser:
/src/main/**/*.map
les deux exemples dans la question sont en fait de très mauvais exemples qui peuvent conduire à la perte de données!
Mon conseil: ne jamais ajouter /*
pour les répertoires .gitignore fichiers, sauf si vous avez une bonne raison!
une bonne raison serait par exemple ce que Jefromi a écrit: " si vous avez l'intention par la suite de ne pas ignorer quelque chose dans le répertoire " .
La raison pour laquelle il autrement, on ne devrait pas ajouter /*
aux répertoires, car d'une part il fonctionne 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 stocker temporairement des fichiers tracés et non tracés) ou git clean -df
(pour supprimer des fichiers non tracés mais garder des fichiers ignorés) dans votre dépôt, Tous les répertoires qui sont ignorés avec un /*
ajouté seront irréversiblement supprimé !
de fond
j'ai dû 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 avec gigaoctets de données locales nécessaires à notre application. Personne ne pouvait l'expliquer et je déteste toujours re-télécharger toutes les données. Après un certain temps, j'ai eu une idée qu'il peut-être à cause de git stash
. Un jour, j'ai voulu nettoyer mon repo local (tout en gardant des fichiers ignorés) et j'ai utilisé git clean -df
et encore mes données ont disparu. Cette fois, j'ai eu assez et a étudié la question. J'ai finalement compris que la raison est le /*
ci-joint.
je suppose qu'il peut être expliqué d'une manière ou d'une autre par le fait que directory/*
ignore tous les contenus du répertoire mais pas le répertoire lui-même. Il n'est donc pas considéré comme suivi ni ignoré quand les choses sont supprimés. Même si git status
et git status --ignored
donner une image légèrement différente.
comment reproduire
Voici comment reproduire le comportement. J'utilise actuellement Git 2.8.4.
Un répertoire appelé localdata/
avec un fichier fictif ( important.dat
) sera créé dans un dépôt git local et le contenu sera ignorée en mettant /localdata/*
dans le .gitignore
fichier. Lorsque l'une des deux commandes git mentionnées est exécutée maintenant, le répertoire sera (inopinément) perdu.
mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file
Si vous faites un git status --ignored
ici, vous obtiendrez:
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
untracked-file
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
localdata/
Maintenant, soit ne
git stash -u
git stash pop
ou
git clean -df
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 bogue, mais Je suppose que c'est au moins une fonctionnalité que personne n'a besoin.
je vais le signaler à la liste de développement git et voir ce qu'ils en pensent.
ce serait:
config/databases.yml
cache
log
data/sql
lib/filter/base
lib/form/base
lib/model/map
lib/model/om
ou peut-être même:
config/databases.yml
cache
log
data/sql
lib/*/base
lib/model/map
lib/model/om
dans le cas où filter
et form
sont les seuls répertoires dans lib qui ont un sous-répertoire base
qui doit être ignoré (voir comme un exemple de ce que vous pouvez faire avec les astérisques).
le premier. Ces chemins de fichier sont relatifs d'où vous .le dossier gitignore l'est.
je maintiens un service basé sur GUI et CLI qui vous permet de générer des modèles .gitignore
très facilement à https://www.gitignore.io .
vous pouvez soit taper les modèles que vous voulez dans le champ de recherche ou installer l'alias de ligne de commande et lancer
$ gi swift,osx
Un échantillon .gitignore fichier peut ressembler à un ci-dessous pour un projet de Studio Android
# built application files
*.apk
*.ap_
# files for the dex VM
*.dex
# Java class files
*.class
# generated files
bin/
gen/
# Local configuration file (sdk path, etc)
local.properties
#Eclipse
*.pydevproject
.project
.metadata
bin/**
tmp/**
tmp/**/*
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
YourProjetcName/.gradle/
YourProjetcName/app/build/
*/YourProjetcName/.gradle/
*/YourProjetcName/app/build/
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# CDT-specific
.cproject
# PDT-specific
.buildpath
# Proguard folder generated by Eclipse
proguard/
# Intellij project files
*.iml
*.ipr
*.iws
.idea/
/build
build/
*/build/
*/*/build/
*/*/*/build/
*.bin
*.lock
YourProjetcName/app/build/
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
.gradle/
app/build/
*app/build/
# Local configuration file (sdk path, etc)
local.properties
/YourProjetcName/build/intermediates/lint-cache/api-versions-6-23.1.bin
appcompat_v7_23_1_1.xml
projectFilesBackup
build.gradle
YourProjetcName.iml
YourProjetcName.iml
gradlew
gradlew.bat
local.properties
settings.gradle
.gradle
.idea
android
build
gradle