Git ignora le sottocartelle


438

Ho molti progetti nella mia soluzione .Net. Vorrei escludere tutte le cartelle "bin / Debug" e "bin / Release" (e il loro contenuto), ma includo comunque la cartella "bin" stessa e tutte le DLL in essa contenute.

.gitignore con "bin /" ignora le cartelle "Debug" e "Release", ma anche tutte le DLL contenute nella cartella "bin".

"bin / Debug" o "bin / Release" nel file .gitignore non esclude le directory, a meno che non definisca pienamente il modello ignore come "Soluzione / Progetto / bin / Debug" - che non voglio fare come me dovrà includere questo modello completo per ciascun progetto nella mia soluzione, nonché aggiungerlo per eventuali nuovi progetti aggiunti.

Eventuali suggerimenti?


Perché aggiungere la DLL? Se si fa riferimento a DLL di terze parti, potrebbe essere opportuno aggiungere una cartella comune a cui fanno riferimento tutti i progetti.
Paddy,

6
Paddy ha ragione: se si tratta di DLL di terze parti, dovrebbero probabilmente essere organizzate lontano dal codice. Per me, tuttavia, sembra che tu stia controllando i tuoi prodotti di costruzione, che non è generalmente il modo in cui vuoi andare. Si utilizza git per tenere traccia delle informazioni , che sono completamente contenute nel codice e costruire la configurazione. I prodotti sono, beh, prodotti. Rintracciarli richiede problemi: ad esempio, cosa succede se si modifica il codice ma si dimentica di creare e archiviare nuovi prodotti?
Cascabel,

Ho avuto un problema con l'esclusione delle sottocartelle. Ho provato di tutto, inclusi i campioni esatti scritti qui, ma senza successo. Alla fine ho aggiunto un'ulteriore riga vuota tra i modelli di cartelle e funziona. Forse un problema di codifica. Ho Windows e l'ho codificato in UTF8.
RoadBump,

Risposte:


552

Hai provato i caratteri jolly?

Solution/*/bin/Debug
Solution/*/bin/Release

Con la versione 1.8.2 di git, puoi anche usare il **carattere jolly per abbinare qualsiasi livello di sottodirectory:

**/bin/Debug/
**/bin/Release/

8
Funziona, tranne se esiste una sottocartella con un altro progetto in es. Solution / Module / Project, quindi per ora ho aggiunto / * / * / bin / Debug e / * / * / * / bin / Debug (per sub cartelle). Sembra che tu debba aggiungere una sottocartella jolly per ciascun livello nella struttura della directory.
Marcel,

1
@Marcel: Beh, certamente Git non ignorerà nessun file a cui non gli dici - ignora qualunque cosa corrisponda ai caratteri jolly, né più né meno.
Cascabel,

Penso che la doppia stella attraverserà i confini della directory, ovvero: / ** / bin / Debug
Trento,

11
@ Taras: Sfortunatamente no.
Tuukka Mustonen,

2
Si è verificato un errore in Visual Studio **. Ormai dovrebbe essere risolto. link
Bogac

106

Puoi usare .gitignore al livello più alto per ignorare tutte le directory del progetto con lo stesso nome. Per esempio:

Debug/
Release/

Questo dovrebbe aggiornarsi immediatamente in modo che sia visibile quando si esegue lo stato git. Assicurati che queste directory non siano già state aggiunte a git, poiché ciò sovrascriverà gli ignori.


Lo stesso si può fare aggiungendo i pattern al $GIT_DIR/.git/info/excludefile OPs .
Tim Henigan,

1
La differenza è che il file .gitignore seguirà il codice, quindi si applica ovunque. Considerando che il file exclude è locale solo per il proprio repository, il che significa che si applica solo per quel repository specifico. A meno che altri committer non abbiano un motivo per voler impegnare queste directory, consiglierei di usare .gitignore.
Andreas,

1
Un altro problema con questo è se hai un progetto nella tua soluzione chiamato Debug, che verrà quindi ignorato. Penso che la soluzione sia una combinazione di tutte le risposte e i commenti: ristrutturare la soluzione per mantenere le DLL comuni o di riferimento in una cartella diversa, quindi ignorare "bin /" e / o utilizzare i caratteri jolly.
Marcel

16
+1 Per un commento su come assicurarsi che le directory non siano già state aggiunte a git. Se già aggiunto a git, fai:git rm -rf DirectoryName/
levibostian

57

La questione non sta chiedendo di ignorare tutte le sottodirectory, ma non riuscivo a trovare la risposta da nessuna parte, quindi mi post-it: */*.


1
Qualche possibilità che potresti chiarire? Ho provato ogni sorta di variazioni su questo e non riesco git adda ignorare una directory e tutti i file in tutte le sottodirectory di quella directory. Ho cercato dirname/, dirname/*, dirname/**, dirname/*/*, anche nella disperazione dirname/*/*/*, dirname/*/*/*/*, dirname/*/*/*/*/*.
Chris,

3
*/*ignora tutte le sottodirectory ma non i file nella directory corrente. Ignorare una sottodirectory specifica è normale utilizzo di gitignore. dirname, dirname/e dirname/*tutti lavorano per me. È già stato eseguito il commit di qualcosa in quella directory?
mgold

È un repository nuovo di zecca - elimino l'intera .gitdirectory tra i tentativi, git initquindi git add --all .(ho provato anche senza --all), usando 1.9.4.msysgit.1. Ogni sottodirectory non vuota nella mia directory nominata viene aggiunta all'indice (selezionata in TortoiseGit e git status). Non ci sono linee rilevanti .gitignoreall'inizio !ma deve esserci qualche conflitto. Risolto per ora rimuovendo le cartelle durante add. Immagino che questo sia qualcosa che richiederà un po 'più di scavo per fornire le informazioni necessarie per la diagnosi. Grazie per avermi rassicurato sul fatto che non sto fraintendendo la sintassi.
Chris,

Cosa succede se devo ignorare una cartella all'interno di una cartella, ma non la prima? Come nel forum / ignorethisfolder / ... ma non deve ignorare la cartella chiamata forum
Jean Carlos Racoski,

Questo non funziona per me nell'ignorare una directory il cui nome inizia con un punto. " /. " e ". * / *" non funzionano neanche.
Tony,

44

Tutte le risposte sopra sono valide, ma qualcosa che non credo sia menzionato è che una volta aggiunto un file da quella directory al repository, non puoi ignorare quella directory / sottodirectory che contiene quel file (git ignorerà quella direttiva ).

Per ignorare i file già aggiunti, eseguire

$ git rm --cached

Altrimenti dovrai prima rimuovere tutti i file dalla directory di destinazione del repository, quindi puoi ignorare quella cartella.


12
git rm - cache se li vuoi non tracciati / irrilevanti per la cronologia ma vuoi mantenere intatti i file localmente.
Erik Reppen,

29

Oltre a inserire le voci corrette nel tuo file .gitignore, se stai cercando di ignorare qualcosa già aggiunto al repository, devi farlo git rm -r /path/to/dire impegnarlo prima di aggiungere la directory al tuo file .gitignore. Altrimenti l'unica cosa che git ignorerà è la tua direttiva ignore.


19

L'unico modo per farlo funzionare sulla mia macchina era farlo in questo modo:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
/*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/

Nota come devi consentire esplicitamente il contenuto per ogni livello che desideri includere. Quindi, se ho sottodirectory 5 temi profondi, devo ancora precisarlo.

Questo è dal commento di @ Yarin qui: https://stackoverflow.com/a/5250314/1696153

Questi erano argomenti utili:

Ho anche provato

*
*/*
**/**

e **/wp-content/themes/**

o /wp-content/themes/**/*

Niente di tutto ciò ha funzionato neanche per me. Molte tracce ed errori!


13

Per escludere contenuto e sottodirectory:

**/bin/*

Per escludere solo tutte le sottodirectory ma prendere il contenuto, aggiungi "/":

**/bin/*/

9

Per ignorare tutte le sottodirectory puoi semplicemente usare:

**/

Funziona a partire dalla versione 1.8.2 di git.


8

Il modo generico di ignorare tutte le sottocartelle, pur continuando a tenere traccia dei file che si trovano nella /bindirectory sarebbe quello di aggiungere la seguente riga al file .gitignore del progetto:

bin/*/*

Se vuoi ignorare solo determinate sottocartelle con nome, puoi fare:

bin/Debug/*
bin/Release/*

nb. se la bindirectory non si trova nella radice del progetto (insieme al file .gitignore), invece di es. bin/*/*potresti aver bisogno dipath/to/bin/*/*

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.