ignorando qualsiasi directory 'bin' su un progetto git


1236

Ho una struttura di directory come questa:

.git/
.gitignore
main/
  ...
tools/
  ...
...

All'interno di main e strumenti, e di qualsiasi altra directory, a qualsiasi livello, può esserci una directory 'bin', che voglio ignorare (e voglio ignorare tutto anche sotto di essa). Ho provato ciascuno di questi schemi in .gitignore ma nessuno di essi funziona:

/**/bin/**/*
/./**/bin/**/*
./**/bin/**/*
**/bin/**/*
*/bin/**/*
bin/**/*
/**/bin/* #and the others with just * at the end too

Qualcuno mi può aiutare? Il primo modello (quello che penso dovrebbe funzionare) funziona bene se lo faccio:

/main/**/bin/**/*

Ma non voglio avere una voce per ogni directory di livello superiore e non voglio modificare .gitignore ogni volta che ne aggiungo una nuova.

Questo è su Windows usando l'ultimo msysgit.

EDIT: un'altra cosa, ci sono file e directory che hanno la sottostringa "bin" nei loro nomi, non voglio che vengano ignorati :)


14
Probabilmente qualcuno lo troverà utile: se hai pochi repository e ognuno ha lo stesso file .gitignore, puoi metterlo in una posizione "comune" e lanciarlo> git config --global core.excludesfile ~ / .gitignore_global L'ultimo parametro è path nella posizione comune. PS: sono nuovo a git e non sono sicuro che si tratti della raccomandazione "best practice". Per favore fatemi sapere se non dovreste voler farlo. Grazie.
Budda,

La **sintassi sembra ora (marzo 2013, git 1.8.2) documentata ufficialmente: vedi la mia risposta qui sotto
VonC

2
Se qualcuno vuole leggere la versione più aggiornata della pagina del manuale attuale, consultare la pagina del manuale di gitignore (5) .

opzione più amichevole se sei stanco di leggere saggi per un valore di una riga di informazioni atlassian.com/git/tutorials/saving-changes/…
suazithustra

Risposte:


1835

Prima della versione 1.8.2, **non aveva alcun significato speciale in .gitignore. A partire da 1.8.2 git supporta il **significato di zero o più sottodirectory (vedi note di rilascio ).

Il modo per ignorare tutte le directory chiamate bin ovunque al di sotto del livello corrente in un albero di directory è con un .gitignorefile con il modello:

bin/

Nella manpagina, c'è un esempio di ignorare una directory chiamata foousando un modello analogo.

Modifica: se hai già delle cartelle bin nel tuo indice git che non desideri più tracciare, devi rimuoverle esplicitamente. Git non smetterà di tracciare i percorsi che sono già stati tracciati solo perché ora corrispondono a un nuovo .gitignoremodello. Eseguire una cartella remove ( rm ) solo dall'indice ( --cached ) ricorsivelly ( -r ). Esempio di riga di comando per la cartella bin root:

git rm -r --cached bin

72
A partire da git 1.8.2, git accetterà **nei .gitignorefile (fonte: 1.8.2
log delle modifiche

15
è binlo stesso di bin/?
Nisba,

29
@Nisba, sono diversi, binignorerà i file di nome bin, mentre bin/è per le directory di nome bin
Rani Kheir,

8
da quando mi sono imbattuto in questo: il nome della cartella nel comando git È case sensitive :) "bin! = Bin" - forse risparmierò qualcuno qualche minuto con questo suggerimento :)
dba,

1
In windows10 non è possibile creare un file .gitignore, è necessario creare un gitignore.txt e quindi eseguire ren gitignore.txt .gitignore nel prompt dei comandi per creare questo file
malandato

463

Il .gitignoretuo sogno sembra essere:

bin/

al livello superiore.


Grazie mille per il tuo aiuto, non dimenticarti di fare il checkout dell'esempio di file ignorato: git checkout bin *
Chris Sim

1
mettilo in gitignore_global
μολὼν.λαβέ

@GAlexander, perché si dovrebbe ignorare globalmente bin / directory? Spesso hanno contenuti con versione. E l'ignore globale non influirà sugli altri utenti del repository.
Michael Krelin - hacker

234

Penso che valga la pena menzionare per i principianti git:

Se hai già registrato un file e vuoi ignorarlo, Git non ignorerà il file se aggiungi una regola in seguito . In questi casi, è necessario prima annullare la traccia del file, eseguendo il comando seguente nel terminale:

git rm --cached

Quindi, se si desidera aggiungere per ignorare alcune directory nel repository locale (che già esistono) dopo aver modificato .gitignore, si desidera eseguirlo nella directory principale

git rm --cached -r .
git add .

Fondamentalmente "aggiornerà" il repository locale e eliminerà i file ignorati.

Vedere:

http://git-scm.com/docs/git-rm ,

https://help.github.com/articles/ignoring-files/


se di solito eseguo un git add -Acommit, posso invece usarlo? e posso sostituire il punto con -A anche sulla prima riga?
ajax333221,

69

Non ha **mai funzionato correttamente prima, ma da git 1.8.2 (8 marzo 2013) , sembra essere esplicitamente menzionato e supportato:

I pattern .gitignoree i .gitattributesfile possono avere **/, come pattern che corrisponde a 0 o più livelli di sottodirectory .

Ad esempio " foo/**/bar" corrisponde " bar" in " foo" stesso o in una sottodirectory di " foo".

Nel tuo caso, ciò significa che questa riga potrebbe ora essere supportata:

/main/**/bin/

46
[Bb]in/

corrisponde a lettere maiuscole e minuscole


2
[B]in/essere l'unico maiuscolo
Gank,

Come lasciare che solo la Bincartella ignori e permetta bina git? [B]in/commetterà entrambi Bine bin.
Gank,

5
Questo dovrebbe farlo, @Gank: Bin/ !bin/
Marco G,

34

Non l'ho visto menzionato qui, ma questo sembra essere case sensitive. Una volta modificato in / Bin, i file sono stati ignorati come previsto.


3
Questa non è una risposta alla domanda originale di cui si parlava esplicitamente bin, no Bin.
CB Bailey,

50
Sebbene non sia una risposta, si aggiunge alla completezza per gli altri che cercano lo stesso problema (me stesso, proprio ora).
Jay,

25

[Bb]in risolverà il problema, ma ... Ecco un elenco più ampio di cose che dovresti ignorare (elenco di esempio di GitExtension):

#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.sbr
obj/
[Rr]elease*/
_ReSharper*/

3
Nota: roba del genere dovrebbe essere nel tuo gitignore GLOBALE (di solito nella tua directory home.) Il progetto gitignore dovrebbe ignorare solo le cose specifiche del tuo progetto (es. File .o per un'app C).
BraveNewCurrency


18

Passaggio 1: aggiungere il seguente contenuto al file .gitignore.

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/

# Visual Studio 2015 cache/options directory
.vs/

Passaggio 2: assicurarsi che abbia effetto

Se il problema persiste, ciò è dovuto al fatto che le impostazioni in .gitignore possono ignorare solo i file che inizialmente non sono stati monitorati . Se alcuni file sono già stati inclusi nel sistema di controllo della versione, la modifica di .gitignore non è valida. Per risolvere completamente questo problema, è necessario aprire Git Bash o la console di gestione dei pacchetti (vedere la schermata seguente) per eseguire i seguenti comandi nella cartella principale del repository.

$ git rm -r --cached .
$ git add .
$ git commit -m 'Update .gitignore'

Console PM Quindi il problema sarà completamente risolto.


8

Letteralmente nessuna delle risposte ha funzionato per me; l'unico che ha funzionato per me era (su Linux):

**/bin
(yes without the / in the end)

git version 2.18.0 

Ciò ha ignorato anche tutte le cartelle nominate binnelle sottodirectory?
Vineeshvs,

5

Come un avviso;

Se ci pensi .gitignorenon funziona in un modo (quindi ha aggiunto una foo/*cartella al suo interno ma git statusmostra ancora quel contenuto (i) della cartella come modificato o qualcosa del genere), allora puoi usare questo comando;

git checkout -- foo/*


3

per 2.13.3 e versioni successive, scrivere solo bin nel file .gitignore dovrebbe ignorare il bin e tutte le sue sottodirectory e file

bidone


2

L'aggiunta di ** / bin / al file .gitignore ha fatto il trucco per me (Nota: la cartella bin non è stata aggiunta all'indice).


1

Se il modello all'interno .gitignoretermina con una barra /, troverà solo una corrispondenza con una directory.

In altre parole, bin/corrisponderà a una directory bine ai percorsi sottostanti, ma non corrisponderà a un file normale o un collegamento simbolico bin.


Se il modello non contiene una barra , come in binGit lo considera come un pattern glob shell (avido). Quindi il migliore sarebbe usare semplice /bin.

bin non sarebbe la soluzione migliore per questo particolare problema.


Intendevi "iniziare con" a /?
Vineeshvs,

0

Nel mio caso la codifica del file gitignore era problematica, controlla se è UTF-8

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.