Question Comment ignorer les fichiers dans un répertoire dans Git?


Quelle est la syntaxe appropriée pour le .gitignore fichier pour ignorer les fichiers dans 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/*

?


494
2017-12-15 22:34


origine


Réponses:


FORMAT DE MOTIF

  • 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 optionnel ! ce qui nie le modèle; tout fichier correspondant exclu par un motif précédent sera à nouveau inclus. Si un motif inversé correspond, cela remplacera les sources de modèles de priorité inférieure.

  • Si le motif se termine par une barre oblique, il est supprimé pour les besoins de la description suivante, mais il ne trouvera qu'une correspondance avec un répertoire. En d'autres termes, foo/ correspondra à un répertoire foo et les chemins en dessous, mais ne correspondra pas à un fichier régulier ou à un lien symbolique foo (Ceci est cohérent avec le fonctionnement de pathspec en général dans git).

  • Si le motif ne contient pas de barre oblique /, git le traite comme un motif de globes shell et recherche une correspondance avec le chemin d'accès par rapport à l'emplacement du .gitignore fichier (relatif au toplevel de l'arbre de travail sinon d'un .gitignore fichier).

  • Sinon, git traite le motif comme un glob de coquille approprié à la consommation par fnmatch(3) avec le FNM_PATHNAME flag: les caractères génériques du motif ne correspondront pas à un / dans le chemin Par exemple, Documentation/*.html allumettes Documentation/git.html mais non 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 allumettes cat-file.c mais non mozilla-sha1/sha1.c.

Vous pouvez trouver plus ici

git help gitignore
ou
man gitignore


337
2017-12-15 22:39



Ce serait le premier. Passez par les extensions au lieu de la structure de dossier.

C'est à dire. mon exemple C # développement ignore le 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
~$*

Mettre à jour

Je pensais que je fournirais une mise à jour à partir des commentaires ci-dessous. Bien que ne répondant pas directement à la question de l'OP, voir 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

D'autres exemples d'utilisation spécifique du langage peuvent être trouvés ici (merci au commentaire de Chris McKnight):

https://github.com/github/gitignore


170
2017-12-15 22:39



Les chemins contenant des barres obliques sont relatifs au répertoire contenant le fichier .gitignore - généralement le niveau supérieur de votre référentiel, bien que vous puissiez é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. La seule fois où vous devez mettre une barre oblique est quand il y a n'est pas un sur le chemin déjà. Par exemple, pour ignorer foo uniquement au niveau supérieur du référentiel, utilisez /foo. Simplement écrire foo ignorerait tout ce qu'on appelle foo n'importe où dans le dépôt.

Vos caractères génériques sont également redondants. Si vous voulez ignorer un répertoire entier, nommez-le simplement:

lib/model/om

La seule raison d'utiliser des caractères génériques comme vous l'avez est si vous avez l'intention d'ignorer ultérieurement quelque chose dans le répertoire:

lib/model/om/*      # ignore everything in the directory
!lib/model/om/foo   # except foo

116
2017-12-16 04:21



Une barre oblique indique que l'entrée ignore doit uniquement être valide par rapport au répertoire dans lequel réside le fichier .gitignore. En précisant *.o ignorerait tous les fichiers .o dans ce répertoire et tous les sous-répertoires, tandis que /*.o serait simplement les ignorer dans ce dir, alors que, encore une fois, /foo/*.o ne les ignorerait que dans /foo/*.o.


76
2017-12-15 22:40



Si vous voulez mettre un fichier .gitignore au niveau supérieur et le faire fonctionner pour n'importe quel dossier en dessous /**/.

Par exemple. ignorer tout *.map fichiers dans un /src/main/ l'utilisation du dossier et des sous-dossiers:

/src/main/**/*.map

26
2018-06-22 09:34



Les deux exemples de la question sont en fait de très mauvais exemples pouvant entraîner une perte de données!

Mon conseil: ne jamais ajouter /* aux répertoires 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 ne plus ignorer quelque chose dans le répertoire".

La raison pour laquelle cela ne devrait pas être fait est que /* Les répertoires fonctionnent d’une manière telle qu’ils ignorent correctement tout le contenu du répertoire, mais d’autre part, ils ont un effet secondaire dangereux:

Si vous exécutez git stash -u (pour stocker temporairement des fichiers suivis et non-suivis) ou git clean -df (pour supprimer les fichiers non suivis mais garder les fichiers ignorés) dans votre référentiel, tous les répertoires qui sont ignorés avec un fichier ajouté /* sera irréversiblement supprimé!

Un peu de fond

J'ai dû apprendre cela à la dure. Quelqu'un dans mon équipe était en train d'ajouter /* à certains répertoires dans notre .gitignore. Au fil du temps, j'ai eu des occasions où certains répertoires disparaissaient soudainement. Annuaires avec gigaoctets de données locales nécessaires à notre application. Personne ne pouvait l'expliquer et j'ai toujours le droit de télécharger à nouveau toutes les données. Après un moment, j'ai eu une idée que cela pourrait avoir à voir avec git stash. Un jour, je voulais nettoyer mon repo local (tout en gardant les fichiers ignorés) et j'utilisais git clean -df et encore mes données ont disparu. Cette fois-ci j'en ai eu assez et j'ai enquêté sur le problème. J'ai finalement compris que la raison en est la /*.

Je suppose que cela peut être expliqué en quelque sorte par le fait que directory/* ignore tout le contenu du répertoire mais pas le répertoire lui-même. Ainsi, il n'est considéré ni suivi ni ignoré lorsque les choses sont supprimées. Même si git status et git status --ignored donner une image légèrement différente à ce sujet.

Comment reproduire

Voici comment reproduire le comportement. J'utilise actuellement Git 2.8.4.

Un répertoire appelé localdata/ avec un fichier fictif dedans (important.dat) sera créé dans un dépôt git local et le contenu sera ignoré 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 (de manière inattendue) 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 aurez:

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 faire

git stash -u
git stash pop

ou

git clean -df

Dans les deux cas, le répertoire prétendument ignoré localdata sera parti!

Je ne suis pas sûr que cela puisse être considéré comme un bogue, mais je suppose que c'est au moins une fonctionnalité dont personne n'a besoin.

Je vais rapporter cela à la liste de développement git et voir ce qu'ils en pensent.


22
2017-10-23 19:19



Ce serait:

config/databases.yml
cache
log
data/sql
lib/filter/base
lib/form/base
lib/model/map
lib/model/om

ou même éventuellement:

config/databases.yml
cache
log
data/sql
lib/*/base
lib/model/map
lib/model/om

au cas où filter et form sont les seuls répertoires dans lib qui ont un basesous-répertoire qui doit être ignoré (voir un exemple de ce que vous pouvez faire avec les astérisques).


14
2017-12-15 22:37



Le premier. Ces chemins de fichiers sont relatifs à l'emplacement de votre fichier .gitignore.


13
2017-12-15 22:37



Je maintiens un service basé sur l'interface graphique et l'interface de ligne de commande qui vous permet de générer .gitignore modèles très facilement à https://www.gitignore.io.

Vous pouvez taper les modèles que vous voulez dans le champ de recherche ou installer l'alias de ligne de commande et exécuter

$ gi swift,osx


3
2017-07-15 16:43



Un échantillon .gitignore fichier peut ressembler à celui ci-dessous pour un projet Android Studio

# 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
2017-07-10 11:18