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/*

?

502
demandé sur Peter Mortensen 2011-12-16 02:34:35

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épertoire foo et à des chemins sous celui-ci, mais ne correspondra pas à un fichier régulier ou à un lien symbolique foo (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 Drapeau FNM_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 ou tools/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

341
répondu Op De Cirkel 2017-05-02 05:14:19

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):

https://github.com/github/gitignore

170
répondu Luke Hutton 2017-05-23 11:55:01

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
121
répondu Cascabel 2011-12-16 04:21:11

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.

76
répondu jørgensen 2011-12-16 12:46:06

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
26
répondu petrsyn 2015-06-22 09:45:56

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.

24
répondu jox 2017-07-18 12:13:53

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).

14
répondu aefxx 2011-12-15 22:37:23

le premier. Ces chemins de fichier sont relatifs d'où vous .le dossier gitignore l'est.

13
répondu Unixmonkey 2011-12-15 22:37:16

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

4
répondu Joe 2016-07-15 16:43:42

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
0
répondu S H 2017-07-10 11:18:08