git add * (asterisco) vs git add. (periodo)


130

Sono nuovo in git e ho una domanda sull'aggiunta di file in git. Ho trovato più domande StackOverflow circa la differenza tra git add .e git add -a, git add --all, git add -A, ecc, ma sono stato in grado di trovare un posto che spiega cosa git add *fa. Ho anche guardato la pagina man di git add , ma non ha aiutato. L'ho usato al posto di git add .e il mio collega mi ha chiesto perché. Non avevo una risposta. L'ho sempre usato git add *.

Sono git add .e git add *la stessa cosa? Uno aggiunge i file modificati solo dalla directory corrente, mentre l'altro aggiunge file dalla directory e dalle sottodirectory correnti (in modo ricorsivo)?

C'è un ottimo grafico elencato in una delle altre domande dello stack che mostra la differenza tra git add -A git add .e git add -u, ma non ha git add *.

inserisci qui la descrizione dell'immagine

Nota: capisco cosa significa usare l'asterisco come carattere jolly (aggiungi tutti i file con una determinata estensione). Ad esempio, git add *.htmlpotrebbe aggiungere tutti i file che hanno .htmlun'estensione (ma ignorano .css, .jse così via).

Grazie per l'aiuto!


1
Da dove viene quel grafico? Ho appena provato di git add .nuovo e ha messo in scena un file eliminato senza problemi, a differenza Xdi quanto suggerirebbe in quella riga.
David il

@David Quell'immagine proviene da questa risposta e si applica alle versioni precedenti di git.
jerry

4
Immagine obsoleta! Git 2.x è diverso: i.stack.imgur.com/KwOLu.jpg
Hannes Schneidermayer

Risposte:


132

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

add . non ha alcun significato speciale nella tua shell, e quindi Git aggiunge l'intera directory ricorsivamente, che è quasi la stessa, ma include i file i cui nomi iniziano con un punto.


6
quindi git add .aggiunge tutti i file, cartelle e sottocartelle, incluso .gitignore e qualsiasi altra cosa che inizia con un punto, mentre git add *aggiungerebbe file, cartelle e sottocartelle, eccetto quelle che iniziano con un punto? È esatto?
Tyler Youngblood

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

4
git add .rispetta anche .gitignore, mentre git add *genererà un errore se tutti i file non-punto sono gitignored. Molto meglio da usare git add .di git add *.
rosuav

2
Vale la pena notare: se si richiama Git su DOS / Windows da CMD.EXE, è Git , non la shell, che espande il file *. In questo caso Git troverà i file punto.
torek

2
@ Thor84no: Git troverà i file punto anche su un sistema Linux, se citi il *per proteggerlo dalla shell. Non è una questione di parte nascosta, è solo che le regole compilate in Git differiscono.
torek

30

*non fa parte di git: è un carattere jolly interpretato dalla shell. *si espande a tutti i file nella directory corrente e solo successivamente viene passato a git, che addli s tutti. .è la directory corrente stessa e in git addessa verrà aggiunta insieme a tutti i file sottostanti.


1
Quindi ci sarebbe un motivo per usare l'asterisco? C'è qualche vantaggio nell'usarlo al posto del ciclo? O vice versa? Sono sicuro di averlo visto in un tutorial. Non avrei saputo usarlo altrimenti. Non sono un tipo da riga di comando (come hai indubbiamente indovinato).
Tyler Youngblood

5
*evita file nascosti (cioè file il cui nome inizia con a .). In ogni caso, se non stai aggiungendo file specifici, lo userei semplicemente git add -u(o git add -Ase stai creando nuovi file).
Mureinik

3
Dato che entrambi avete risposto alla mia domanda, ho avuto difficoltà a decidere a chi dare merito. Ho scelto Denis qui sotto perché ha meno reputazione di te. Quindi ho pensato che dargli l'assegno verde lo avrebbe avvantaggiato più di quanto avrebbe giovato a te. Spero che abbia un senso? Ma apprezzo davvero entrambe le spiegazioni. Grazie!
Tyler Youngblood

7

Usare il punto . nella shell di solito significa "la directory corrente".

Quando si utilizza l'asterisco *su una shell, file-globbingviene utilizzata una funzione chiamata . Ad esempio, su bash la funzione glob()fa proprio questo. La manpage di 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.

Corrispondenza con 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.

Ciò significa che quando si passano argomenti a qualsiasi programma sulla riga di comando che contiene '?', '*'o '[', il primo globbing espande il pattern jolly in un elenco di file e quindi fornisce questi file come argomento al programma stesso.

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

git addsi aspetta che venga aggiunto un elenco di file. Nell'esempio sopra la shell si espande *o .rispettivamente e fornisce il risultato come parametro da aggiungere a git. Ora la differenza è che con git add .git si espanderà nella directory corrente mentre git add *innesca il globbing dei file e tale si espande a tutti i file e le directory che non iniziano con un punto.


5

Per chiarezza, metto la risposta nella tabella seguente:

inserisci qui la descrizione dell'immagine

Note aggiuntive (ispirate al commento @ reka18):

Nota 1. git add -A ei git add -ucomandi eseguiti senza parametri aggiuntivi sarebbero un ulteriore raffinamento (indicazione di sottodirectory o maschera per il nome del file) che funzionano nell'intervallo dell'intera directory di lavoro (anche se eseguiamo il comando nella sottodirectory di lavoro della directory).

Nota 2. I .e *sono rispettivamente il percorso della directory (directory corrente) e il carattere jolly, che chiariscono il percorso del comando. Ad esempio, se il comando git add .o git add *viene eseguito in una sottodirectory di una directory di lavoro, la loro azione viene utilizzata solo all'interno di questa sottodirectory, non nell'intera directory di lavoro.

Nota 3. I comandi git add -Ae git add -upossono essere ulteriormente perfezionati aggiungendo un percorso o una maschera per i file, ad esempio, git add -A app/controllerso git add -u app\styles\*.


2
Quindi a partire da Git v2.x git add -Ae git add .sono identici?
reka18

Grazie @ reka18, per un'ottima domanda. Mi ha ispirato a completare la mia risposta ... La risposta alla tua domanda: se lo chiami nella directory di lavoro, no, ma se in una sottodirectory, allora sì ( git add -Avale per l'intera directory di lavoro e git add .sempre per la directory corrente).
simhumileco

2
  • git add -A (--all) Aggiunge tutto, in modo che tutto nella cartella su disco sia rappresentato nell'area di gestione temporanea

  • git add . Mette in scena tutto, ma non rimuove i file che sono stati eliminati dal disco

  • git add * Mette in scena tutto, ma non i file che iniziano con un punto e non rimuove i file che sono stati eliminati dal disco

  • git add -u (--update) Mette in scena solo i file modificati, rimuove i file che sono stati eliminati dal disco, non aggiunge nuovi

  • git add <file name 1> <file name 2> Aggiunge solo alcuni file

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.