webentwicklung-frage-antwort-db.com.de

git add * (Sternchen) vs git add. (Zeitraum)

Ich bin neu in Git und habe eine Frage zum Hinzufügen von Dateien in Git. Ich habe mehrere Stackoverflow-Fragen zum Unterschied zwischen git add . Und git add -a, git add --all, git add -A Usw. gefunden. Aber ich konnte keinen Platz finden das erklärt, was git add * macht. Ich habe mir sogar die git add man page angesehen, aber es hat nicht geholfen. Ich habe es anstelle von git add . Verwendet und mein Kollege hat mich gefragt, warum. Ich hatte keine Antwort. Ich habe gerade immer git add * Verwendet.

Sind git add . Und git add * Gleich? Fügt einer geänderte Dateien nur aus dem aktuellen Verzeichnis hinzu, während der andere Dateien aus dem aktuellen Verzeichnis und den Unterverzeichnissen (rekursiv) hinzufügt?

Auf einer der anderen Stapelfragen ist ein hervorragendes Diagramm aufgeführt, das den Unterschied zwischen git add -Agit add . Und git add -u Zeigt, das jedoch kein git add * Enthält.

enter image description here

Hinweis: Ich verstehe, was es bedeutet, den Stern als Platzhalter zu verwenden (fügen Sie alle Dateien mit einer bestimmten Erweiterung hinzu). Zum Beispiel würde git add *.html Alle Dateien mit der Erweiterung .html Hinzufügen (ignorieren Sie jedoch .css, .js Usw.).

Danke für die Hilfe!

107

add * bedeutet, dass alle Dateien im aktuellen Verzeichnis hinzugefügt werden, mit Ausnahme der Dateien, deren Name mit einem Punkt beginnt. Dies ist Ihre Shell-Funktionalität und Git empfängt immer nur eine Liste von Dateien.

add . hat in Ihrer Shell keine spezielle Bedeutung, und daher fügt Git das gesamte Verzeichnis rekursiv hinzu, was fast dasselbe ist, jedoch Dateien einschließt, deren Namen mit einem Punkt beginnen.

102
Denis

* ist kein Teil von git - es ist ein Platzhalter, der von der Shell interpretiert wird. * dehnt sich auf alle Dateien im aktuellen Verzeichnis aus und wird erst dann an git übergeben, das sie alle add sind. . ist das aktuelle Verzeichnis selbst und git adding es wird es und alle Dateien darunter hinzufügen.

23
Mureinik

Die Verwendung des Punktes . In der Shell bedeutet normalerweise "das aktuelle Verzeichnis".

Wenn Sie das Sternchen * In einer Shell verwenden, wird eine Funktion namens file-globbing Verwendet. Z.B. Beim Bash macht die Funktion glob() genau das. Die Manpage für glob (man 7 glob) Besagt:

[~ # ~] Beschreibung [~ # ~]

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.

Wildcard Matching

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.

Das heißt, wenn Sie Argumente an ein Programm in der Befehlszeile übergeben, das '?', '*' Oder '[' Enthält, wird das Platzhaltermuster beim ersten Globbing in eine Liste von Dateien umgewandelt und diese dann ausgegeben Dateien als Argument für das Programm selbst.

Der Bedeutungsunterschied zwischen 'git add .' Und 'git add *' Wird eindeutig durch Denis beschrieben:

git add Erwartet, dass eine Liste von Dateien hinzugefügt wird. Im obigen Beispiel erweitert die Shell * Bzw. . Und gibt das Ergebnis als Parameter für git add aus. Der Unterschied besteht nun darin, dass mit git add . Git in das aktuelle Verzeichnis expandiert, während git add * Das Verschieben von Dateien auslöst und auf alle Dateien und Verzeichnisse expandiert, die nicht mit einem Punkt beginnen.

6
codingdave

Aus Gründen der Klarheit habe ich die Antwort in die folgende Tabelle eingetragen:

enter image description here

Zusätzliche Anmerkungen (inspiriert durch den @ reka18-Kommentar):

Anmerkung 1. git add -A und git add -u Befehle, die ohne zusätzliche Parameter ausgeführt werden, würden eine zusätzliche Verfeinerung (Unterverzeichnis oder Maskenangabe für den Dateinamen) im Bereich des gesamten Arbeitsverzeichnisses bewirken (auch wenn wir den Befehl im Arbeitsunterverzeichnis des Verzeichnisses ausführen).

Anmerkung 2. Die . und * sind jeweils der Verzeichnispfad (aktuelles Verzeichnis) und der Platzhalter, die den Pfad des Befehls verdeutlichen. Zum Beispiel, wenn die git add . oder git add * Befehl wird in einem Unterverzeichnis eines Arbeitsverzeichnisses ausgeführt, dann wird ihre Aktion nur in diesem Unterverzeichnis verwendet, nicht im gesamten Arbeitsverzeichnis.

Anmerkung 3. Die git add -A und git add -u-Befehle können durch Hinzufügen eines Pfads oder einer Maske für Dateien weiter verfeinert werden, z. B. git add -A app/controllers oder git add -u app\styles\*.

5
simhumileco