web-dev-qa-db-fra.com

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

?

529
Chris McKnight

FORMAT DU 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 _!_ qui annule le motif; tout fichier correspondant exclu par un modèle précédent sera à nouveau inclus. Si un motif négatif correspond, cela remplacera les sources de motifs 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 trouvera une correspondance avec un répertoire. En d'autres termes, _foo/_ correspondra à un répertoire foo et aux chemins situés en dessous, mais ne correspondra pas à un fichier normal ou à un lien symbolique foo (ceci est cohérent avec le fonctionnement de pathspec général en git).

  • Si le motif ne contient pas de barre oblique _/_, git le traite comme un motif global Shell et recherche une correspondance avec le chemin d'accès par rapport à l'emplacement du fichier _.gitignore_ (par rapport au niveau supérieur du travail). tree si ce n’est pas à partir d’un fichier _.gitignore_).

  • Sinon, git considère le motif comme un glob Shell qui convient à la consommation de fnmatch(3) avec l'indicateur _FNM_PATHNAME_: les caractères génériques dans le motif ne correspondent pas à un _/_ du chemin. Par exemple, _Documentation/*.html_ correspond à _Documentation/git.html_ mais pas _Documentation/ppc/ppc.html_ ou _tools/perf/Documentation/perf.html_.

  • ne barre oblique correspond au début du chemin. Par exemple, _/*.c_ correspond à _cat-file.c_ mais pas _mozilla-sha1/sha1.c_.

Vous pouvez trouver plus ici

git help gitignore
ou
man gitignore

363
Op De Cirkel

Ce serait l'ancien. Aller par les extensions aussi bien au lieu de la structure de dossier.

C'est à dire. mon exemple de développement C # 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 fournir une mise à jour à partir des commentaires ci-dessous. Bien que ne répondant pas directement à la question du PO, reportez-vous à la section suivante pour plus d'exemples de syntaxe .gitignore.

Wiki de la communauté (constamment mis à jour):

. gitignore pour les projets et solutions Visual Studio

Vous trouverez ici d'autres exemples d'utilisation d'un langage spécifique (grâce au commentaire de Chris McKnight):

https://github.com/github/gitignore

180
Luke Hutton

Les chemins contenant des barres obliques sont considérés comme étant 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 avez besoin de mettre une barre oblique est quand n'est pas déjà dans le chemin. Par exemple, pour ignorer foo uniquement au niveau supérieur du référentiel, utilisez /foo. Écrire simplement foo ignorerait tout ce qui est appelé 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:

lib/model/om

La seule raison pour laquelle vous utilisez des caractères génériques est la suivante: si vous avez l'intention de ne pas ignorer ultérieurement quelque chose dans le répertoire:

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

Une barre oblique indique que l'entrée ignorer ne doit être valide que par rapport au répertoire dans lequel réside le fichier .gitignore. Spécifier *.o ignorerait tous les fichiers .o de ce répertoire et tous les sous-répertoires, tandis que /*.o les ignorerait simplement dans ce répertoire, tandis que /foo/*.o ne les ignorerait que dans/foo/*. .o.

77
jørgensen

Si vous souhaitez placer un fichier .gitignore au niveau supérieur et le faire fonctionner pour tout dossier situé en dessous, utilisez /**/.

Par exemple. Pour ignorer tous les fichiers *.map d'un dossier /src/main/, utilisez les éléments suivants:

/src/main/**/*.map
31
petrsyn

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

Mon conseil: n’ajoutez jamais /* aux répertoires des fichiers .gitignore, à moins que vous n’ayez 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 de /* aux répertoires fonctionne d’une part de la même manière qu’il ignore correctement tout le contenu du répertoire, tout en ayant un effet secondaire dangereux. :

Si vous exécutez git stash -u (pour masquer temporairement les fichiers suivis et non suivis) ou git clean -df (pour supprimer les fichiers non suivis mais conservés,) dans votre référentiel, tous les répertoires ignorés avec un /* ajouté seront ajoutés. be irréversiblement supprimé!

Un peu de fond

J'ai dû apprendre cela à la dure. Quelqu'un de mon équipe ajoutait /* à certains répertoires de notre .gitignore. Au fil du temps, j'ai eu des occasions où certains annuaires disparaissaient soudainement. Répertoires contenant des gigaoctets de données locales nécessaires à notre application. Personne ne peut l'expliquer et j'ai toujours le goût de télécharger à nouveau toutes les données. Après un moment, j'ai eu l'idée que cela pourrait avoir un rapport avec git stash. Un jour, j'ai voulu nettoyer mon référentiel local (tout en conservant les fichiers ignorés) et j'utilisais git clean -df et mes données ont de nouveau 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 le /* ajouté.

Je suppose que cela peut s’expliquer par le fait que 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 des éléments sont supprimés. Même si git status et git status --ignored donnent une image légèrement différente.

Comment se reproduire

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

Un répertoire appelé localdata/ contenant un fichier factice (important.dat) sera créé dans un référentiel git local et le contenu sera ignoré en plaçant /localdata/* dans le fichier .gitignore. . Lorsque l'une des deux commandes git mentionnées est exécutée maintenant, le répertoire sera perdu (de manière inattendue).

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 aura disparu!

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.

28
jox

Le premier. Ces chemins de fichiers sont relatifs à l'endroit où se trouve votre fichier .gitignore.

14
Unixmonkey

Ce serait:

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

ou éventuellement 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 de lib qui ont un sous-répertoire base qui doit être ignoré (voyez-le comme un exemple de ce que vous pouvez faire avec les astériques).

14
aefxx

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

Vous pouvez taper les modèles souhaités dans le champ de recherche ou installer l’alias de ligne de commande et exécuter

$ gi Swift,osx

4
Joe

Un exemple de fichier . Gitignore 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
Shirish Herwade