2015-08-11 3 views
5

Ich habe in several places gelesen, dass das Verhalten von git add -Ahas changed ein bisschen im Laufe der Zeit.git add -A:/auf Git 2.X und Beziehung mit pathspec

Ab 2.x (z. B. Git 2.5.0), was genau macht git add -A :/? Ich konnte die Option : oder :/ in the documentation nicht finden. Ist es ein pathspec? Wie das? Die Beispiele, die die Dokumentation bereitstellt, zeigen nur Glob-Muster (z. B. *.c) oder einfache Pfadspezifikationen (z. B. dir, um irgendetwas unter dir hinzuzufügen).

+0

http://git-scm.com/docs/gitglossary.html suche nach pathspec :) – shengy

Antwort

3

Da git 2.0, git add -A und git add -A :/ sind bitte gleich.
Aber die magische pathspec :/ ist nicht neu und stammt aus git 1.7.6 (Apr 2011). Siehe commit 8a42c98. Es ist dokumentiert, in Documentation/glossary-content.txt

Eine Pfadangabe, die mit einem Doppelpunkt beginnt : besondere Bedeutung hat.
In der Kurzform, der führende Doppelpunkt : wird gefolgt von Null oder mehr "magische Signatur" Buchstaben (die optional durch einen anderen Doppelpunkt : abgeschlossen ist), und der Rest ist das Muster gegen den Pfad.

:top: or :/ 

Das Zauberwort top (Magie Unterschrift: /) macht die Mustererkennung von der Wurzel des Baumes arbeiten, auch wenn Sie den Befehl ausführen aus dem Inneren eines Unterverzeichnis.


Beachten Sie, dass, wenn Sie einen Ordner hinzufügen möchten namens ':/' (git add -A :/), dies möglich sein wird, nur in git 2,7 (Nov 2015)
Siehe commit 29abb33 (25. Oktober 2015) von Junio C Hamano (gitster).

Seit Git 2.0 „add -u“ und „add -A“ run aus einem Unterverzeichnis ohne Pfadangabe bedeutet „alles in der Arbeits Baum“ (vor 2.0 wurden sie in das aktuelle Verzeichnis begrenzt).
Die Beschränkung auf das aktuelle Verzeichnis wurde implementiert, indem "." in die Befehlszeile eingefügt wurde, wenn der Endbenutzer keine Pfadangabe angegeben hatte.
Bei 2.0 haben wir den Code aktualisiert, um ":/" (anstelle von ".") einzufügen, um alles von der obersten Ebene zu betrachten, indem ein pathspec magic "top" verwendet wird.

(Dies wird nicht mehr benötigt, und fixiert, die in dem 29abb33 commit: die Umsetzung von git add -A länger kein :/ für die kommende git 2.7 verwenden)

übrigens eine derartige Vereinfachung auch eine Ecke Fall Fehler behebt dass davon herrührt, dass ":/" nicht unbedingt Magie bedeutet.
Ein Benutzer würde sagen "git --literal-pathspecs add -u :/" über die Befehlszeile, wenn sie ein Verzeichnis ':' hat und alles darin hinzufügen will (und sie weiß, dass ihre :/ wird als 'alles unter der Sonne' magic pathspec genommen, es sei denn, sie deaktiviert die Magie mit --literal-pathspecs).

Die interne Verwendung von '' würde sich genauso verhalten wie solch ein explizit angegebenes ": /" bei der Ausführung mit "--literal-pathspecs" und fügt nicht alles unter die Sonne wie ursprünglich vorgesehen.

Da die interne Verwendung von :/ nicht mehr ist, wird ein git --literal-pathspecs add -u :/ tatsächlich funktionieren, und fügen Sie Dateien unter dem Ordner mit dem Namen „Spalte“ (‚:‘).

+0

Danke VonC, wenn du oben gesagt hast "" (Dies wird nicht mehr benötigt und in diesem Commit fixiert) "' was genau haben Sie sich darauf bezogen? Was kommt gleich danach? – Josh

+1

@Josh Ich beziehe mich auf https://github.com/git/git/commit/29abb33978f713cd0a5cc3687bf61077b0928840: seine Implementierung (von 'git add -A ') nicht mehr':/'für die kommende git 2.7, die' ermöglicht git add -A:/', um tatsächlich einen Ordner namens':/'hinzufügen zu können (anstatt durch den magischen Pfad':/'überschrieben zu werden, der vor dem Commit intern für' git add -A' verwendet wurde) – VonC

3

git add -A :/ fügt alle Änderungen zum Index hinzu, auch wenn Sie sich gerade nicht im obersten Projektordner befinden. Aber in späteren git Versionen, es ist die gleiche wie git add -A

Angenommen, Sie haben Ihr Projekt wie folgt aus:

➜ top git:(master) tree . 
. 
├── b.c 
└── subfolder 
    └── a.c 

Dann änderte man Code in b.c, aber Sie sind zur Zeit in subfolder

➜ subfolder git:(master) ✗ git st 
On branch master 
Changes not staged for commit: 
    (use "git add <file>..." to update what will be committed) 
    (use "git checkout -- <file>..." to discard changes in working directory) 

    modified: ../b.c 

no changes added to commit (use "git add" and/or "git commit -a") 

Running git add . jetzt wird NICHTb.c zu Ihrem Index hinzufügen, und alt git add -A wird NICHT auch. Aber in älteren Git, git add -A :/ wird den Trick machen.

Wenn keine Pfadangabe gegeben wird, wenn -A-Option verwendet wird, werden alle Dateien im gesamten Arbeitsbaum aktualisiert (alte Versionen von Git verwendet das Update auf das aktuelle Verzeichnis und dessen Unterverzeichnissen zu begrenzen).

Weitere Informationen lesen git help add git help gitglossary

Verwandte Themen