Qual è la differenza tra Git che ignora la directory e la directory / *?


108

Sono confuso su quale sia il modo corretto per ignorare il contenuto di una directory in git.

Supponiamo di avere la seguente struttura di directory:

my_project  
     |--www  
         |--1.txt  
         |--2.txt
     |--.gitignore

Qual è la differenza tra il mettere questo:

www

E questo?

www/*

Il motivo per cui sto facendo questa domanda è: in git, se una directory è vuota, git non includerà tale directory vuota nel repository. Quindi stavo provando la soluzione che è aggiungere un file .gitkeep in più nella directory in modo che non sia vuoto. Quando stavo provando quella soluzione, se nel file .gitignore, scrivo come di seguito:

www
!*.gitkeep

Non funziona (la mia intenzione è ignorare tutti i contenuti in www ma mantenere la directory). Ma se provo quanto segue:

www/* 
!*.gitkeep

Allora funziona! Quindi penso che debba avere alcune differenze tra i due approcci.


Una semplice differenza tra bine bin/è che il primo ignorerà i file o le cartelle, il secondo solo le cartelle. Non conosco la differenza conbin/*
Colonnello Panico

Risposte:


203

Ci sono differenze tra www, www/e www/*.

Fondamentalmente dalla documentazione e dai miei test, wwwtrova una corrispondenza con un file o una directory, www/corrisponde solo a una directory, mentre trova www/*directory e file all'interno www.

Discuterò solo sulle differenze tra www/e www/*qui, poiché le differenze tra wwwe www/sono ovvie.

Perché www/git ignora la directory wwwstessa, il che significa che git non guarderà nemmeno all'interno. Ma per www/*, git controlla tutti i file / cartelle all'interno wwwe li ignora tutti con il modello *. Sembra portare agli stessi risultati poiché git non tiene traccia di una cartella vuota wwwse tutti i suoi file / cartelle secondari vengono ignorati. E in effetti i risultati non faranno alcuna differenza per il caso di OP con www/o www/*standalone. Ma fa differenze se combinato con altre regole.

Ad esempio, cosa succede se vogliamo includere www/1.txtma ignorare solo tutti gli altri all'interno www?

Quanto segue .gitignorenon funzionerà.

www/
!www/1.txt

Mentre quanto segue .gitignorefunziona, perché?

www/*
!www/1.txt

Per il primo, git ignora semplicemente la directory wwwe non guarda nemmeno all'interno per includerla di www/1.txtnuovo. La prima regola esclude la directory principale wwwma non www/1.txte di conseguenza www/1.txtnon può essere " inclusa di nuovo ".

Ma per quest'ultimo, git prima ignora tutti i file / foler sotto www, quindi ne include di nuovo uno che è www/1.txt.

Per questo esempio, le seguenti righe nella documentazione possono aiutare:

Un prefisso opzionale "!" che nega il pattern; qualsiasi file corrispondente escluso da un modello precedente verrà nuovamente incluso. Non è possibile includere nuovamente un file se una directory principale di quel file è esclusa.


Non pensi che www/1.txte poi www/farebbe lo stesso del secondo approccio ...
Naveed Butt

8

Sto solo analizzando la documentazione e, per quanto posso dire, differiscono solo per modelli più avanzati, ad es

$ cat .gitignore
    # exclude everything except directory foo/bar
    /*
    !/foo
    /foo/*
    !/foo/bar

Ho fatto prova di quanto sopra, e se si sostituisce !/foocon !/foo/*, è effettivamente ottenere un risultato diverso.

Nota

foo

Escluderà qualsiasi file foo, ma

foo/

escluderà solo le directory denominate foo.


3

A parte le risposte perfettamente buone che hai già ottenuto, dovresti notare che puoi avere .gitignoreovunque nel tuo progetto, comprese le sottocartelle.

Quindi, se vuoi ignorare tutti i file all'interno www, ma desideri che la wwwcartella abbia una versione, invece di usare un vuoto .gitkeep, .dummyo qualsiasi nome tu scelga, perché non usare un .gitignorelì, che dice di ignorare tutti i file?

/
|- .gitignore   (a)
\- www
    |- .gitignore   (b)
    |- 1.jpg
    \- 2.jpg

Nella radice .gitignore(a), non dici nulla sulla wwwcartella o sul suo contenuto.

Nella www/.gitignore(b) inserisci quanto segue:

# ignore all files in this folder except this .gitignore
*
!.gitignore

In questo modo tutto sembra più organizzato (almeno a me).


1

Per ignorare tutto in una directory tranne i dotfile puoi usare il seguente glob-pattern nel tuo .gitignore:

www/[^.]*

Quindi non c'è bisogno di un extra .gitignore, basta semplicemente aggiungere un .keepfile alla tua wwwdirectory.

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.