2014-09-25 32 views
65

Sono nuovo di git e ho una domanda sull'aggiunta di file in git. Ho trovato più domande StackOverflow sulla differenza tra git add . e git add -a, git add --all, git add -A, ecc. Ma non sono riuscito a trovare un posto che spieghi cosa fa git add *. Ho anche guardato il git add man page, ma non è stato d'aiuto. L'ho usato al posto di git add . e il mio collega mi ha chiesto perché. Non avevo una risposta Ho sempre usato solo git add *.git add * (asterisco) vs git add. (periodo)

Sono git add . e git add * lo stesso? Si aggiungono solo i file modificati dalla directory corrente, mentre l'altro aggiunge i file dalla directory corrente e dalle sottodirectory (in modo ricorsivo)?

C'è un grande grafico quotata una delle altre domande di stack che mostra la differenza tra git add -Agit add . e git add -u, ma non ha git add *.

enter image description here

Nota: ho capito che cosa significa utilizzare l'asterisco come un carattere jolly (aggiungere tutti i file con una determinata estensione). Ad esempio, git add *.html aggiungerebbe tutti i file con estensione .html (ma ignorare .css, .js, ecc.).

Grazie per l'aiuto!

+1

Da dove viene questo grafico? Ho appena provato 'git add .' di nuovo, e ha messo in scena un file cancellato senza problemi, a differenza del' X' in quella riga suggerirebbe. – David

+0

@David Quell'immagine proviene da [questa risposta] (http://stackoverflow.com/a/2603901/12/1270168) e si applica alle versioni precedenti di git. – jerry

+2

Immagine superata! Git 2.x è diverso: https://i.stack.imgur.com/KwOLu.jpg –

risposta

63

add * significa aggiungere tutti i file nella directory corrente, ad eccezione dei file il cui nome inizia con un punto. Questa è la tua funzionalità di shell e Git riceve sempre e solo una lista di file.

add . non ha alcun significato speciale nella shell, pertanto Git aggiunge l'intera directory in modo ricorsivo, che è quasi la stessa, ma include i file i cui nomi iniziano con un punto.

+3

quindi 'git add .' aggiunge tutti i file, le cartelle e le sottocartelle, incluso .gitignore e qualsiasi altra cosa che inizia con un punto, mentre' git add * 'aggiungerebbe qualsiasi file, cartella e sottocartella, ad eccezione di quelli che iniziano con un punto? È esatto? – Tyler

+5

Questo è davvero corretto. Inoltre, 'git add *' aggiungerebbe ancora i file che iniziano con un punto se si trovano in una sottodirectory. – Denis

+1

'git add'' rispetta anche .gitignore, mentre' git add * 'genererà un errore se qualche file non-dot viene gitignorato. Molto meglio usare 'git add .' di' git add * '. – rosuav

12

* non fa parte di git, è un jolly interpretato dalla shell. * si espande in tutti i file nella directory corrente e viene quindi passato a git, che è add s tutti. . è la directory corrente e git add aggiungendolo e tutti i file sottostanti.

+0

Quindi ci sarebbe un motivo per usare l'asterisco? C'è qualche vantaggio nell'utilizzarlo al posto di un punto? O vice versa? Sono sicuro di averlo visto in un tutorial. Non avrei saputo usarlo altrimenti. Non sono un granché un tipo da linea di comando (come indubbiamente avete indovinato). – Tyler

+2

'*' evita i file nascosti (ad es. I file che il loro nome inizia con un '.'). In ogni caso, se non si aggiungono file specifici, utilizzare semplicemente 'git add -u' (o' git add -A' se si stanno creando nuovi file). – Mureinik

+0

Dato che entrambi avete risposto alla mia domanda, ho avuto difficoltà a decidere a chi dare credito. Ho scelto Denis di seguito perché ha meno rappresentanti di te. Quindi ho pensato che dargli l'assegno verde gli avrebbe giovato molto di più di quanto non avrebbe giovato a te. Spero che abbia un senso? Ma apprezzo davvero entrambe le spiegazioni. Grazie! – Tyler

4

L'utilizzo del punto . nella shell indica in genere "la directory corrente".

Quando si utilizza l'asterisco * su una shell viene utilizzata una funzionalità denominata file-globbing. Per esempio. su bash la funzione glob() sta facendo proprio questo.La pagina di manuale glob (man 7 glob) afferma:

DESCRIZIONE

Long ago, in UNIX V6, there was a program /etc/glob that would expand 
wildcard patterns. Soon afterward this became a shell built-in. 
These days there is also a library routine glob(3) that will perform this 
function for a user program. 

caratteri jolly

A string is a wildcard pattern if it contains one of the characters '?', '*' or '['. 

Globbing

Globbing is the operation that expands a wildcard pattern 
into the list of pathnames matching the pattern. 

Questo significa che quando si passa argomenti a qualsiasi programma sulla riga di comando che contengono '?', '*' o '[', prima globbing espande il modello jolly in un elenco di file e poi dà questi file come argomento al programma stesso.

La differenza di significato tra 'git add .' e 'git add *' è chiaramente descritto da Denis:

git add si aspetta una lista di file da aggiungere. Nell'esempio precedente la shell espande rispettivamente * o . e fornisce il risultato come parametro per aggiungere git. Ora la differenza è che con git git add . si espanderà nella directory corrente mentre git add * attiva il globbing dei file e tale espansione si estende a tutti i file e le directory che non iniziano con un punto.