2010-02-08 5 views
56

Ich habe mehrere .screen-Dateien in /xxx/documentation und ihre Unterverzeichnisse, die bereits von Git verfolgt werden.git: Wie füge ich rekursiv alle Dateien in einem Verzeichnisbaum hinzu, die einem Glob-Muster entsprechen?

Nach viele dieser Bildschirmdateien ändern, ich laufe git add documentation/\\*.screen -as durch das erste Beispiel angegeben in git-add ‚s-Dokumentation zu diesen Dateien Bühne, aber der Befehl fehlschlägt:

fatal: pathspec 'documentation/\*.screen' did not match any files

ist mein Befehl schlecht, oder hat git einen Fehler?

Antwort

59

Es ist ein Fehler in der Dokumentation. Zitat das Sternchen mit

$ git add documentation/\*.screen

oder

$ git add 'documentation/*.screen'

, um das gewünschte Verhalten zu erhalten.

Wenn stattdessen wollen Sie Dateien im aktuellen Verzeichnis hinzuzufügen, nur

$ git add *.screen

UPDATE verwenden: ich einen patch vorgelegt, der das Problem behebt, now fixed ab Version 1.6.6.2.

+0

Führen diese beiden Befehle zum selben Ergebnis? Was ist mit nur Dateien im aktuellen Verzeichnis hinzufügen, aber nicht seine Unterverzeichnisse? –

+0

Übrigens erwähnte Kubi, dass der Befehl auf seiner Maschine funktionierte, was sagst du? –

+0

@Phuong Ja, die beiden Befehle führen zum selben Ergebnis. Um Dateien nur im aktuellen Verzeichnis hinzuzufügen, geben Sie das Argument nicht an (z. B. git add * .screen). Ich glaube, Kubi und Aaron haben deine Frage missverstanden, weil ich überrascht war zu lernen (danke, dass du mich dazu aufgefordert hast!), Dass Git-Add diese Funktion hat. –

1

versuchen

git add ./documentation/*.screen 
+0

Ist es nicht fügen Sie den Befehl nur Datei von ./documentation, nicht von seiner Unterverzeichnisse? –

+0

Sie haben Recht. Ich habe gerade Ihren ursprünglichen Befehl an meinem Computer ausprobiert und es hat gut funktioniert. – kubi

4

Sie die Schale für *.screen (dh genau diese Zeichenfolge - die es nicht gibt - statt dessen, was man „alle Dateien möchten, die mit .screen Ende) suchen erzählt. Lassen Sie die \\ so die Schale kann für Sie den Dateinamen Expansion tun.

+0

In diesem Handbuch wurde mir gesagt, dass ich die doppelten Backslashes http://www.kernel.org/pub/software/scm/git/docs/git-add.html hinzufügen soll. Was sagst du? –

+0

Ich habe das Beispiel gelesen und ich verstehe, was sie tun wollen (rekursive hinzufügen), aber warum scheitert der Befehl? Der Fehler deutet darauf hin, dass entweder keine Datei mit der Erweiterung ".screen" im Verzeichnis vorhanden ist oder dass das Muster nicht erweitert wird. –

+0

Nun, das ist komisch, denn wenn ich die doppelten Backslashes entferne, erzeugt der Befehl keinen Fehler. –

17

Ich habe die akzeptierte Antwort versucht, aber es hat für mich nicht funktioniert .. also hier ist mein nur, falls jemand es ist Arbeit ohne viel Zeit in Sezieren verschiedenen Aspekten erledigen will, die das Problem verursachen könnten:

find documentation -name "*.screen" | xargs git add -u 

// die Option -u git-add fügt nur die Dateien zu indizieren, die zuvor verfolgt wurden und modifizierte

+0

Ist "Dokumentation" in Ihrem Fall der Name eines Verzeichnisses innerhalb des Arbeitsbaums des Repos oder ein relativer Pfad von außerhalb des Arbeitsbaums zur Toplevel des Repos? –

4

das, was ich für ein ähnliches Problem nur verwendet git alle Dateien in einem Verzeichnis hinzugefügt:

find . | sed "s/\(.*\)/\"\1\"/g" | xargs git add 

Für die ursprüngliche Frage würde der Befehl:

find -name "*.screen" | sed "s/\(.*\)/\"\1\"/g" | xargs git add 

Bitte beachte, dass ich mit dem Fall zu tun habe, wo ein vollständig angegebener Dateiname Leerzeichen enthält. Deshalb meine Antwort. Bearbeiten Sie den Teil vor dem ersten |, um verschiedene Dateien zum Hinzufügen auszuwählen.

1

git add * .java funktioniert für mich hinzufügen rekursiv alle Java-Dateien

+1

Wow, es funktioniert auch für mich! Aber nur, wenn sich im aktuellen Verzeichnis keine '.java'-Dateien befinden. Wenn dies der Fall ist, werden nur diese Dateien hinzugefügt. –

Verwandte Themen