Come faccio a ignorare i file in una directory in Git?


544

Qual è la sintassi corretta affinché il .gitignorefile ignori i file in una directory?

Sarebbe

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

o

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

?


5
fa la .gitignoredifferenza tra file e directory che ignora? per esempio, datavs data/significa cose diverse?
Charlie Parker,

6
@CharlieParker yes-ish: dataignorerà i file e le directory corrispondenti, data/ignorerà solo le directory corrispondenti.
jox,

Ricorda sempre se hai messo in scena o eseguito il commit del file che stai tentando di ignorare, quindi non c'è modo di ignorarlo :( Solo i miei 2 centesimi dopo aver pensato di aver sbagliato il mio schema e di aver perso un quarto d'ora.
Adam,

@Adam corretto dovresti aggiornare .gitignore quindi unstage / git rm --cache il file.
Chris McKnight,

Risposte:


374

FORMATO DEL MODELLO

  • Una riga vuota non corrisponde a nessun file, quindi può fungere da separatore per la leggibilità.

  • Una riga che inizia con #funge da commento.

  • Un prefisso opzionale !che nega il modello; qualsiasi file corrispondente escluso da un modello precedente verrà nuovamente incluso. Se un modello negato corrisponde, questo sovrascriverà le origini dei modelli con precedenza inferiore.

  • Se il modello termina con una barra, viene rimosso ai fini della seguente descrizione, ma troverebbe solo una corrispondenza con una directory. In altre parole, foo/corrisponderà a una directory fooe ai percorsi sottostanti, ma non corrisponderà a un file normale o un collegamento simbolico foo(questo è coerente con il modo in cui pathspec funziona in generale in git).

  • Se il modello non contiene una barra /, git lo considera come un modello glob shell e verifica una corrispondenza con il nome percorso relativamente alla posizione del .gitignorefile (rispetto al livello superiore dell'albero di lavoro se non da un .gitignorefile).

  • Altrimenti, git considera il pattern come un glob shell adatto al consumo fnmatch(3)con la FNM_PATHNAMEbandiera: i caratteri jolly nel pattern non corrisponderanno a /nel nome del percorso. Ad esempio, Documentation/*.htmlcorrisponde Documentation/git.htmlma non Documentation/ppc/ppc.htmloppure tools/perf/Documentation/perf.html.

  • Una barra iniziale corrisponde all'inizio del nome percorso. Ad esempio, /*.ccorrisponde cat-file.cma non mozilla-sha1/sha1.c.

Puoi trovare di più qui

git help gitignore
o
man gitignore


2
Come posso mettere un file .gitignore al livello più alto e farlo funzionare per qualsiasi cartella sottostante? Grazie.
Royi

104
-1 TL; DR e risponde a malapena alla domanda. Si tratta di directory, non di file, quindi la sezione in grassetto è solo a proposito di ginnastica mentale. @Jefromi era più diretto.
Bob Stein,

Ho letto l'uomo e la risposta di @ Jefromi è migliore - purché tu abbia letto anche l'avvertimento di @ jox - e quello di @ Luke Hutton potrebbe essere più utile per ignorare, ad esempio, i file di progetto IDE.
WillC

1
Questo è in realtà un copia-incolla dalla documentazione git
mcont

1
Non sono sicuro (essenzialmente) copiare e incollare una manpagina o un documento ufficiale è il formato migliore per SO ...
jdk1.0

183

Sarebbe il primo. Vai anche dalle estensioni invece che dalla struttura delle cartelle.

Vale a dire il mio esempio di sviluppo C # ignora il file:

#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
~$*

Aggiornare

Ho pensato di fornire un aggiornamento dai commenti qui sotto. Sebbene non risponda direttamente alla domanda del PO, vedere quanto segue per ulteriori esempi di .gitignoresintassi.

Wiki della comunità (in costante aggiornamento):

.gitignore per progetti e soluzioni Visual Studio

Altri esempi con un uso specifico della lingua sono disponibili qui (grazie al commento di Chris McKnight):

https://github.com/github/gitignore


5
@Stallman, questo è il range. Quindi abbina *.Objpure *.obj.
norbert,

131

I percorsi che contengono barre sono considerati relativi alla directory contenente il file .gitignore, generalmente il livello più alto del repository, sebbene sia possibile inserirli anche in sottodirectory.

Pertanto, poiché in tutti gli esempi forniti, i percorsi contengono barre, le due versioni sono identiche. L'unica volta che è necessario mettere una barra principale è quando c'è non è uno nel percorso già. Ad esempio, per ignorare foo solo al livello superiore del repository, utilizzare /foo. Scrivere semplicemente fooignorerebbe qualsiasi cosa chiamata foo ovunque nel repository.

Anche i caratteri jolly sono ridondanti. Se vuoi ignorare un'intera directory, semplicemente chiamala:

lib/model/om

L'unico motivo per utilizzare i caratteri jolly nel modo in cui hai è se hai intenzione di successivamente ignorare qualcosa nella directory:

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

5
Spiegazione migliore della risposta accettata per questa domanda
eerrzz

78

Una barra iniziale indica che la voce ignora deve essere valida solo rispetto alla directory in cui risiede il file .gitignore. Specificare *.oignorerebbe tutti i file .o in questa directory e tutti i sottodir, mentre /*.oli ignorerebbe in quella directory , mentre ancora una volta /foo/*.oli ignorerebbe solo in /foo/*.o.


34

Se vuoi mettere un file .gitignore al livello superiore e farlo funzionare per qualsiasi cartella sottostante utilizzalo /**/ .

Ad esempio, per ignorare tutti i *.mapfile in una /src/main/cartella e le sottocartelle usano:

/src/main/**/*.map

Dovevo farlo. Non sono sicuro del motivo per cui hai bisogno di due ** . Uno era abbastanza per me.
Novocaina,

8
** corrisponde anche ai file nelle sottodirectory
petrsyn

Grazie per le informazioni @petrsyn
Novocaine

30

Entrambi gli esempi nella domanda sono in realtà esempi molto cattivi che possono portare alla perdita di dati!

Il mio consiglio: non aggiungere mai /*alle directory nei file .gitignore, a meno che tu non abbia una buona ragione!

Un buon motivo potrebbe essere, ad esempio, ciò che scrisse Jefromi: "se si intende successivamente ignorare qualcosa nella directory" .

Il motivo per cui altrimenti non dovrebbe essere fatto è che l'aggiunta /*alle directory funziona da un lato nel modo in cui ignora correttamente tutto il contenuto della directory, ma dall'altro ha un pericoloso effetto collaterale:

Se si esegue git stash -u(per archiviare temporaneamente file tracciati e non tracciati) o git clean -df(per eliminare file non tracciati ma mantenendo file ignorati) nel proprio repository, tutte le directory che vengono ignorate con un allegato /*verranno eliminate in modo irreversibile !

Qualche sfondo

Ho dovuto imparare questo nel modo più duro. Qualcuno nel mio team stava aggiungendo /*alcune directory nel nostro .gitignore. Nel corso del tempo ho avuto occasioni in cui alcune directory sarebbero improvvisamente scomparse. Directory con gigabyte di dati locali necessari per la nostra applicazione. Nessuno poteva spiegarlo e odio sempre scaricare nuovamente tutti i dati. Dopo un po 'ho avuto l'idea che avrebbe potuto avere a che fare con git stash. Un giorno volevo ripulire il mio repository locale (mantenendo i file ignorati) e stavo usando git clean -dfe di nuovo i miei dati erano spariti. Questa volta ne ho avuto abbastanza e ho indagato sul problema. Ho finalmente capito che il motivo è l'annesso /*.

Presumo che possa essere spiegato in qualche modo dal fatto che directory/*ignora tutti i contenuti della directory ma non la directory stessa. Quindi non viene considerato tracciato né ignorato quando le cose vengono eliminate. Anche se git statuse git status --ignoreddare un'immagine leggermente diversa su di esso.

Come riprodurre

Ecco come riprodurre il comportamento. Attualmente sto usando Git 2.8.4.

Una directory chiamata localdata/con un file fittizio ( important.dat) verrà creata in un repository git locale e il contenuto verrà ignorato inserendolo /localdata/*nel .gitignorefile. Quando uno dei due comandi git menzionati viene eseguito ora, la directory andrà (inaspettatamente) perduta.

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

Se fai un git status --ignoredqui, otterrai:

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/

Adesso neanche

git stash -u
git stash pop

o

git clean -df

In entrambi i casi la directory presumibilmente ignorata localdatasparirà!

Non sono sicuro che questo possa essere considerato un bug, ma immagino sia almeno una caratteristica di cui nessuno ha bisogno.

Lo riferirò alla lista di sviluppo di git e vedrò cosa ne pensano.


15

Sarebbe:

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

o forse anche:

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

in questo caso filtere formsono le uniche directory in lib che hanno una basesottodirectory che deve essere ignorata (vedi come un esempio di cosa puoi fare con gli asterici).


14

Il primo. I percorsi dei file sono relativi alla posizione del file .gitignore.


2
Questo vale solo per i modelli che contengono una barra. Un singolo nome di directory come "mydir" ignorerà anche le directory (e i file) che si trovano nelle sottocartelle a qualsiasi profondità. Mettere solo una barra in avanti lo renderà relativo da dove si trova il tuo file .gitignore.
jox,

4

Sto mantenendo un servizio basato su GUI e CLI che ti consente di generare .gitignoremodelli molto facilmente su https://www.gitignore.io .

È possibile digitare i modelli desiderati nel campo di ricerca o installare l'alias della riga di comando ed eseguire

$ gi swift,osx


0

Un file .gitignore di esempio può apparire come uno di seguito per un progetto 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.