webentwicklung-frage-antwort-db.com.de

Dateien rekursiv nach Muster hinzufügen

Wie füge ich Dateien rekursiv nach einem Muster (oder Glob) hinzu, das sich in verschiedenen Verzeichnissen befindet?

Ich möchte zum Beispiel A/B/C/foo.Java und D/E/F/bar.Java (und mehrere andere Java-Dateien) mit einem Befehl hinzufügen:

git add '*.Java'

Leider funktioniert das nicht wie erwartet.

134
Michel Krämer

Die Antwort von Sergio Acosta ist wahrscheinlich die beste Wahl, wenn einige der hinzuzufügenden Dateien möglicherweise nicht bereits verfolgt werden. Wenn Sie sich auf Dateien beschränken möchten, die git bereits kennt, können Sie git-ls-files mit einem Filter kombinieren:

git ls-files [path] | grep '\.Java$' | xargs git add

Git bietet keine ausgefallenen Mechanismen, um dies selbst auszuführen, da es sich im Grunde um ein Shell-Problem handelt: Wie erhält man eine Liste von Dateien, die einem gegebenen Befehl als Argumente bereitgestellt werden.

72
Cascabel

Sie können git add [path]/\*.Java verwenden, um Java-Dateien aus Unterverzeichnissen hinzuzufügen.
z.B. git add ./\*.Java für das aktuelle Verzeichnis.

Aus git add Dokumentation :

Fügt Inhalt aus allen *.txt-Dateien im Verzeichnis Documentation und seinen Unterverzeichnissen hinzu:

$ git add Documentation/\*.txt

Beachten Sie, dass das Sternchen * in diesem Beispiel aus der Shell zitiert wird. Dadurch kann der Befehl die Dateien aus den Unterverzeichnissen des Documentation/-Verzeichnisses enthalten.

123
Sergey Glotov

Ein bisschen außerhalb des Themas (nicht spezifisch auf git bezogen), aber wenn Sie Linux/Unix verwenden, könnte dies ein Workaround sein:

find . -name '*.Java' | xargs git add

Und wenn Sie Wege mit Leerzeichen erwarten:

find . -name '*.Java' -print0 | xargs -0 git add

Aber ich weiß, das ist nicht genau das, was Sie gefragt haben.

48
Sergio Acosta

Mit zsh können Sie Folgendes ausführen:

git add "**/*.Java"

und alle Ihre *.Java-Dateien werden rekursiv hinzugefügt.

42
Olivier Verdier

Sergejs Antwort (mache mir keine Kredit) funktioniert:

You can use git add [path]/\*.Java

mit einem letzten git:

$git version
git version 1.7.3.4

Dateien für den Test:

$find -name .git -Prune -o -type f -print | sort
./dirA/dirA-1/dirA-1-1/file1.txt
./dirA/dirA-1/dirA-1-2/file2.html
./dirA/dirA-1/dirA-1-2/file3.txt
./dirA/dirA-1/file4.txt
./dirB/dirB-1/dirB-1-1/file5.html
./dirB/dirB-1/dirB-1-1/file6.txt
./file7.txt

Git-Status:

$git status -s
?? dirA/
?? dirB/
?? file7.txt

* .Txt hinzufügen:

$git add \*.txt

Aktualisierter Status:

$git status -s
A  dirA/dirA-1/dirA-1-1/file1.txt
A  dirA/dirA-1/dirA-1-2/file3.txt
A  dirA/dirA-1/file4.txt
A  dirB/dirB-1/dirB-1-1/file6.txt
A  file7.txt
?? dirA/dirA-1/dirA-1-2/file2.html
?? dirB/dirB-1/dirB-1-1/file5.html
10
Alberto

Wenn Sie Ihre Dateien bereits verfolgen und Änderungen daran vorgenommen haben, und Sie diese nun auf der Grundlage eines Musters hinzufügen möchten, können Sie das Flag --modified verwenden

git ls-files --modified | grep '<pattern>' | xargs git add

Wenn Sie beispielsweise nur die CSS-Änderungen zu diesem Commit hinzufügen möchten, können Sie dies tun

git ls-files --modified | grep '\.css$' | xargs git add

Siehe man git-ls-files für weitere Flags

7
Ram

Wie in " git" erwähnt: Wie füge ich rekursiv alle Dateien in einem Verzeichnis-Unterbaum hinzu, die einem Glob-Muster entsprechen? ", wenn Sie das Pfadspec-Globbing (wie '*.Java') ordnungsgemäß maskieren oder angeben, dann ja, git add '*.Java'

Git 2.13 (Q2 2017) verbessert das interaktive Hinzufügen:

commit 7288e12 (14 Mar 2017) von Jeff King (peff) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in commit 153e0d7 , 17 Mar 2017)

add --interactive: Erweitern Sie Pfadspezifikationen nicht mit ls-files.

Wenn wir die Liste der modifizierten Dateien abrufen möchten, erweitern wir zunächst alle vom Benutzer angegebenen Pfadspezifikationen mit "ls-files" und füttern die resultierende Liste der Pfade als Argumente an "diff-index" und "diff-files".
Wenn sich Ihre Pfadspezifikation auf eine große Anzahl von Pfaden erweitert, können Sie auf eines von zwei Problemen stoßen:

  1. Das Betriebssystem kann sich über die Größe des Arguments beklagen. Liste und verweigern zu laufen. Zum Beispiel:

    $ (ulimit -s 128 && git add -p drivers)
    Can't exec "git": Argument list too long at .../git-add--interactive line 177.
    Died at .../git-add--interactive line 177.
    

Das ist im linux.git-Repository, das etwa 20K-Dateien im Verzeichnis "drivers" enthält (in diesem Fall keine davon geändert). Der Trick "ulimit -s" ist notwendig, um das Problem unter Linux selbst bei so riesigen Pfaden zu zeigen.
Andere Betriebssysteme haben viel kleinere Grenzwerte (z. B. wurde ein Fall aus der realen Welt mit nur 5K-Dateien unter OS X gesehen).

  1. Selbst wenn es funktioniert, ist es wirklich langsam. Die Pfadspezifikation Code ist nicht für eine große Anzahl von Pfaden optimiert. Hier ist der gleiche Fall ohne das ulimit:

    $ time git add -p drivers
      No changes.
    
    real  0m16.559s
    user    0m53.140s
    sys 0m0.220s
    

Wir können dies verbessern, indem wir "ls-files" vollständig überspringen und nur die ursprünglichen Pfadspezifikationen den diff-Befehlen zuführen.

In der Vergangenheit war die von "diff-index" unterstützte Sprache für die Pfadspezifikation schwächer, aber das ist nicht mehr der Fall.

2
VonC

Ich wollte nur Dateien hinzufügen, die eine bestimmte Zeichenfolge basierend auf git status hatten:

git status | grep string | xargs git add

und dann konnte git commit -m 'commit msg alle geänderten Dateien mit "Zeichenfolge" im Titel der Datei festschreiben

2
bdanin

Hinzufügen einer Windows-Befehlszeilenlösung, die noch nicht erwähnt wurde:

for /f %G in ('dir /b/s *.Java') do @git add %G
1
selalerer

zeile in ~/.gitconfig einfügen

[alias] addt = !sh -c 'git ls-files | grep \"\\.$1*\" | xargs git add' -

Wenn Sie alle geänderten Java-Dateien hinzufügen möchten, können Sie Folgendes tun: git addt Java

Wenn Sie alle geänderten Python-Dateien hinzufügen möchten, können Sie Folgendes tun: git addt py

0
Hong Emrys

Verwenden Sie einfach git add *\*.Java. Dadurch werden alle .Java-Dateien im Stammverzeichnis und in allen Unterverzeichnissen hinzugefügt.

0
Jan Lovstrand