Come ignoro i file in una directory in Git?

Qual è la syntax corretta per il file .gitignore per ignorare 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/* 

?

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 di corrispondenza escluso da un modello precedente verrà nuovamente incluso. Se un pattern negativo corrisponde, questo sovrascriverà le origini dei pattern di precedenza inferiore.

  • Se il modello termina con una barra, viene rimosso ai fini della seguente descrizione, ma trova solo una corrispondenza con una directory. In altre parole, foo/ una directory foo e i percorsi sottostanti, ma non corrisponderà a un file regolare oa un link simbolico foo (ciò è coerente con il modo in cui pathspec funziona in generale in git).

  • Se il pattern non contiene una barra / , git lo considera come un pattern glob di shell e verifica una corrispondenza con il pathname relativo alla posizione del file .gitignore (rispetto al livello superiore dell’albero di lavoro se non da un .gitignore file).

  • Altrimenti, git tratta il pattern come una shell glob adatta al consumo da fnmatch(3) con il flag FNM_PATHNAME : i caratteri jolly nel pattern non corrispondono a / nel nome del percorso. Ad esempio, Documentation/*.html corrisponde a Documentation/git.html ma non Documentation/ppc/ppc.html o tools/perf/Documentation/perf.html .

  • Una barra iniziale corrisponde all’inizio del nome del percorso. Ad esempio, /*.c corrisponde a cat-file.c ma non a mozilla-sha1/sha1.c

Puoi trovare di più qui

git help gitignore
o
man gitignore

Sarebbe il primo. Vai anche per le estensioni e la struttura delle cartelle.

Cioè il mio esempio C # sviluppo 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 dell’OP, vedere quanto segue per ulteriori esempi di syntax .gitignore .

Wiki della comunità (costantemente aggiornato):

.gitignore per progetti e soluzioni di Visual Studio

Altri esempi con un uso linguistico specifico possono essere trovati qui (grazie al commento di Chris McKnight):

https://github.com/github/gitignore

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

Quindi, poiché in tutti gli esempi forniti, i percorsi contengono barre, le due versioni sono identiche. L’unica volta che è necessario inserire una barra iniziale è quando non ce n’è già una nel percorso. Ad esempio, per ignorare foo solo al livello più alto del repository, utilizzare /foo . Scrivere semplicemente foo ignorerebbe qualsiasi cosa chiamata foo in qualsiasi punto del repository.

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

 lib/model/om 

L’unica ragione per utilizzare i caratteri jolly come si ha è se si intende successivamente ignorare qualcosa nella directory:

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

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

Se vuoi mettere un file .gitignore al livello più alto e farlo funzionare per qualsiasi cartella sottostante usa /**/ .

Ad esempio, per ignorare tutti i file *.map in /src/main/ cartella e sottocartelle utilizzare:

 /src/main/**/*.map 

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

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

Un buon motivo potrebbe essere, ad esempio, quello che Jefromi ha scritto: “se intendi successivamente ignorare qualcosa nella directory” .

Il motivo per cui altrimenti non dovrebbe essere fatto è che l’aggiunta di /* alle directory da un lato funziona nel modo in cui ignora correttamente tutti i contenuti della directory, ma d’altra parte ha un effetto collaterale pericoloso:

Se esegui git stash -u (per memorizzare temporaneamente file tracciati e non tracciati) o git clean -df (per eliminare file non tracciati ma mantieni i file ignorati) nel tuo repository, tutte le directory che vengono ignorate con un /* aggiunto in coda verranno cancellate in modo irreversibile !

Qualche sfondo

Ho dovuto imparare questo nel modo più duro. Qualcuno nel mio team stava aggiungendo /* ad alcune directory nel nostro .gitignore. Nel corso del tempo ho avuto occasioni in cui certe directory sarebbero improvvisamente scomparse. Directory con gigabyte di dati locali necessari per la nostra applicazione. Nessuno potrebbe spiegarlo e ho sempre il compito di ri-scaricare tutti i dati. Dopo un po ‘ho capito che potrebbe avere a che fare con git stash . Un giorno volevo pulire il mio repository locale (mantenendo file ignorati) e stavo usando git clean -df e di nuovo i miei dati erano spariti. Questa volta ne ho avuto abbastanza e ho studiato il problema. Alla fine ho capito che il motivo è l’aggiunta /* .

Presumo che possa essere spiegato in qualche modo dal fatto che la directory/* ignora tutto il contenuto della directory ma non la directory stessa. Quindi non è considerato né rintracciato né ignorato quando le cose vengono cancellate. Anche se git status e git status --ignored danno un’immagine leggermente diversa.

Come si riproduce

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 inserendo /localdata/* nel file .gitignore . Quando uno dei due comandi git menzionati viene eseguito ora, la directory verrà (inaspettatamente) persa.

 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 git status --ignored uno git status --ignored , qui git status --ignored , otterrai:

 On branch master Untracked files: (use "git add ..." to include in what will be committed) untracked-file Ignored files: (use "git add -f ..." to include in what will be committed) localdata/ 

Ora entrambi lo fanno

 git stash -u git stash pop 

o

 git clean -df 

In entrambi i casi la directory localdata presumibilmente ignorata sarà scomparsa!

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

Lo segnalerò alla lista di sviluppo di git e vedremo cosa ne pensano.

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 

nel caso in cui filter e form siano le uniche directory in lib che abbiano una sottodirectory di base che deve essere ignorata (guardala come un esempio di cosa puoi fare con gli asterici).

Il primo. Questi percorsi di file sono relativi da dove si trova il file .gitignore.

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

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

$ gi swift,osx

Un file .gitignore di esempio può essere simile a uno di seguito per un progetto di 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