Git: Kopieren Sie alle Dateien in einem Verzeichnis aus einem anderen Zweig

188

Wie kopiere ich alle Dateien in einem Verzeichnis aus einem anderen Zweig? Ich kann alle Dateien in diesem Verzeichnis auflisten, indem ich dies tue

git ls-tree master:dirname

Ich kann dann alle Dateien einzeln kopieren, indem ich dies tue

git checkout master -- dirname/filename

Die Verwendung von Platzhaltern war jedoch bisher ein völliger Fehlschlag. Das macht nichts:

git checkout master -- dirname/*.png

Obwohl ich denke, dass ich dazu ein Bash-Skript verwenden kann, muss es einen einfacheren Weg geben, oder?

alexenko
quelle

Antworten:

288

Da Sie nicht versuchen, die Dateien im Baum zu verschieben, sollten Sie nur das Verzeichnis auschecken können:

git checkout master -- dirname
CB Bailey
quelle
2
Was ist, wenn ich Commit-Nachrichten für die kopierten Dateien beibehalten möchte?
Totels
2
@totels, streng genommen sind den Dateien keine Commit-Nachrichten zugeordnet. Die Festschreibungsnachricht ist dem Festschreibungsobjekt selbst zugeordnet. Ich vermute, Sie möchten Folgendes: git checkout master -- dirname; git add dirname; git commit -c $COMMIT_SHA1 --reset-author;Wo $COMMIT_SHA1könnte branch_adas Commit-Objekt sein, das die gewünschte Commit-Nachricht enthält? Ich weiß nicht ohne weiteres, wie ich das Commit mit der letzten Änderung andirname
Alexander Bird
1
Dies hat eine sehr seltsame Nebenwirkung. Es kopiert dirname, aber es kopiert auch alle Dateien, die sich in .gitignoreder masterVerzweigung befinden. Irgendeine Idee warum das so ist?
Milimetric
4
Ein weiterer Nebeneffekt Ich denke, wenn der aktuelle Zweig zusätzliche Dateien enthält, die sich nicht in dem Zweig befinden, aus dem Sie auschecken (in einem bestimmten Zielordner), werden diese im Grunde genommen zusammengeführt - vielleicht nur, wenn einer ein Vorfahr ist? Ich bin mir der Bedingungen nicht ganz sicher, aber wenn Sie 20 Dateien in Zweig A und 20 Dateien in Zweig B haben und nur 10 davon denselben Dateinamen haben, erhalten Sie 30 Dateien (zumindest in meinem Fall in Zweig A. ist der Vorfahr von Zweig B)
Codercake
@totels checkt den Befehl git aus cherry-pick. Es werden Commits aus anderen Zweigen angewendet, jedoch nur die Dateien, die in den gewünschten Commits geändert wurden.
CS01
18

Wenn in Pfaden keine Leerzeichen vorhanden sind und Sie wie ich nur an Dateien mit einer bestimmten Erweiterung interessiert sind, können Sie diese verwenden

git checkout otherBranch -- $(git ls-tree --name-only -r otherBranch | egrep '*.java')
test30
quelle
4
Schade, dass Git diese Funktion nicht direkt unterstützt. Genau wie beim OP hätte ich gedacht, es wäre so etwas wiegit checkout master -- *.c
Gregory Kuhn
1
Diese Antwort half mir bei der Antwort: "Wie kann ich Dateien eines bestimmten Musters von einem anderen Zweig in meinen aktuellen Arbeitszweig auschecken?"
usr-local-ΕΨΗΕΛΩΝ