Git: Wie bekomme ich alle Dateien geändert und neue Dateien in einem Ordner oder Zip?

72

Wie meine Frage besagt, schreibe ich nach dem Ändern von Dateien und dem Hinzufügen neuer Dateien in meinem Repository normalerweise Dateien mit git fest , aber manchmal müssen alle geänderten / geänderten Dateien aus Gründen der Organisation in einen Ordner kopiert werden.

Irgendeine Option?

Herr Frage
quelle
Wenn Sie uns mitteilen, was Sie tatsächlich erreichen möchten, sind unsere Antworten möglicherweise etwas hilfreicher.
Cascabel
Es kommt darauf an, manchmal nur um sie zu ftp
Mr Question
Aber "sie zu ftp" ist kein Ziel für sich. Was ist der Grund dafür? Ich wollte nie nur die geänderten Dateien komprimieren, deshalb frage ich mich über den Anwendungsfall.
Sven Marnach
In diesem Fall geht es mehr darum, sie in einen Ordner zu kopieren und nicht zu komprimieren
Mr Question

Antworten:

109

Angenommen, Sie meinen, Sie haben noch keine Festschreibung vorgenommen und möchten alle Dateien verpacken, für die derzeit lokale Änderungen gelten, können Sie die Liste der geänderten Dateien mit abrufen git ls-files --modified. Wenn Sie die Dateien möchten, die beim letzten Festschreiben geändert wurden, können Sie sie verwenden git diff --name-only HEAD^. Wohin Sie von dort aus gehen, liegt bei Ihnen. Beispiele:

zip modified-files.zip $(git ls-files --modified)
cp $(git ls-files --modified) ../modified-files

Beachten Sie, dass hierbei die Versionen der Dateien im Arbeitsbaum verwendet werden.

Wenn Sie Leerzeichen in Dateinamen haben, müssen Sie sich etwas mehr Mühe geben.

(Abhängig davon, was Sie wirklich versuchen, suchen Sie möglicherweise nach git stashInformationen, die alle geänderten Dateien verbergen und einen sauberen Arbeitsbaum hinterlassen, oder Sie möchten einfach einen temporären Zweig erstellen, für den Sie sich verpflichten möchten. )

Cascabel
quelle
1
Dies ist ohne Festschreiben, wie kann ich die neuen Dateien auch bekommen.
Herr Frage
Wenn ich neue Dateien sage, heißt das, bevor ich sie dem Repository hinzufüge
Mr Question
2
Ich glaube, ich habe gefunden, wonach ich gesucht habe: cp $ (git ls-files --modified --others) modifizierte Dateien. Vielen Dank.
Herr Frage
Gibt es überhaupt Möglichkeiten, bestimmte Erweiterungen oder Dateinamen oder sogar Unterordner auszuschließen?
Herr Frage
11
Verwenden Sie --parents, um die Ordner zu kopieren und zu erstellen: cp --parents $ (git ls-files --modified) ../copyfolder/
Russell England
68

Um genau das zu tun, was Sie angefordert haben (vorausgesetzt, Sie haben bereits ein Commit durchgeführt und möchten ein Archiv der Dateien erstellen, die durch das letzte Commit geändert wurden), können Sie Folgendes tun:

git archive --format=zip HEAD `git diff HEAD^ HEAD --name-only` > a.zip

Wenn Sie Dateien in einem Commit entfernt haben, verwenden Sie Folgendes, um einen Pfadspezifikationsfehler zu vermeiden --diff-filter=d:

git archive --format=zip HEAD `git diff --diff-filter=d HEAD^ HEAD --name-only` > a.zip

Aber vielleicht möchten Sie tatsächlich einen Patch erstellen mit:

git diff HEAD^ HEAD > a.patch

und wenden Sie diesen Patch dort an, wo Sie ihn benötigen:

patch -p1 < a.patch

Das Anwenden eines Patches funktioniert natürlich nur, wenn Ihr Zielverzeichnis bereits die alte Version Ihres Repositorys enthält.

Sven Marnach
quelle
1
Ich empfehle, git format-patchanstelle von Piping git diffzu einer Datei zu verwenden
knittl
1
Wie kann ich nach dem Festschreiben auch die neuen Dateien erhalten?
Herr Frage
2
Ein Problem ist, wenn Sie etwas gelöscht haben, erhalten Sie die Fehlermeldung: "fatal: Pfad nicht gefunden: XYZ"
Krzysztof Romanowski
1
Git-Archiv hat perfekt für mich funktioniert. Ich musste die letzten 2 Commits bekommen, also habe ich eines davon gemacht:git archive --format=zip HEAD `git diff HEAD~2 HEAD --name-only` > a.zip
j.snyder
1
Der erste Befehl in dieser Antwort funktionierte unter Windows (7) nicht. Aus irgendeinem Grund wurde beanstandet, dass die Option --name-only unbekannt war. Ich denke, es ist wahrscheinlich nur ein flüchtiges Problem? Um faul zu sein, habe ich Cygwin installiert und konnte es über die Cygwin-Eingabeaufforderung korrekt ausführen.
John Bubriski
16

Wenn Sie TortoiseGIt verwenden, wird dies ebenfalls bereitgestellt.
Wählen Sie den Ordner im Explorer aus.
Klicken Sie mit der rechten Maustaste auf das Menü Auswählen, TortoiseGit-> Protokoll anzeigen.

Wählen Sie das Arbeitsverzeichnis und die zuletzt festgeschriebene Version.
Rechtsklick. Revisionen vergleichen. Wählen Sie Dateien aus, die Sie speichern / exportieren möchten.
Rechtsklick. In Ordner exportieren. Getan.

Nachbeben
quelle
Ich wünschte, mit dem TortoiseGit-Exporttool könnten Sie mehrere Commits auswählen.
Corgalore
7

Zippen Sie die geänderten und neu erstellten Dateien im Git-Repository

zip mychanges.zip $({ (git ls-files --others --exclude-standard) ; (git ls-files --modified)})
Saifullah Khan
quelle
3

Angenommen, Sie haben keine Dateien gelöscht oder umbenannt, sollte dies den Trick tun

Kopieren:

cp --parents $(git status -s | egrep "M|A|AM" | rev | cut -d" " -f1 | rev) destination_folder

Postleitzahl:

zip modified.zip $(git status -s | egrep "M|A|AM" | rev | cut -d" " -f1 | rev)
BRT
quelle
Die cp - Eltern scheinen Verzeichnisse zusammen mit der Datei zu kopieren / zu erstellen. Es gibt eine Möglichkeit, die Dateien zu kopieren und kein Verzeichnis zu erstellen. Ich denke, das Entfernen des Arguments --parents funktioniert einwandfrei :).
Rainu
--parents verwendet den vollständigen Namen der Quelldatei unter DIRECTORY. Das Argument --parents platziert die Dateien am Zielort in derselben Ordnerstruktur wie am Ursprung. Wenn Sie beispielsweise Dateien in Include- und Quellordnern geändert haben, werden sie mit dem Argument --parents in include und source am Zielort abgelegt. [orig / folder_a / file_1, orig / folder_b / file_2] -> [dest / folder_a / file_1, dest / folder_b / file_2] Dies ist sehr nützlich, wenn Sie Dateien in verschiedenen Ordnern desselben Projekts geändert haben (z. B. include und source) Ordner)
BRT
Wenn Sie '??' um egrep "M | A | AM" wie egrep "M | A | AM | ??" zu kopieren, kopieren Sie auch Dateien, die nicht der Versionskontrolle unterliegen. Dies ist nützlich für neue Dateien, die noch nicht hinzugefügt oder festgeschrieben wurden
BRT
Wenn ich "M | A | AM | ??" hinzufüge Ich bekomme : egrep: repetition-operator operand invalid. 😞
Chance Smith
Ich benutze GNU grep 3.3 (2018-05-11)
BRT
1
mkdir -p /c/temp/blah && cp $(git diff <your commit hash> --name-only) /c/temp/blah

Ich benutze Git Bash unter Windows.

user3448451
quelle
0

Hier ist ein Skript, das diesen Prozess erheblich vereinfachen kann. Es kopiert alle geänderten Dateien in das verwendete definierte Verzeichnis und behält auch die Verzeichnisstruktur der Codebasis bei.

run: sh scr.sh.

===============================================

#!/bin/sh
FILES=`git ls-files --modified`
for x in $FILES
do
        prev_dir=$PWD
        echo "MY Dir = $prev_dir"
        mkdir -p $1/$x
        cd $1/$x
        cd ../
        rm -r *
        cp $prev_dir/$x ./.
        cd $prev_dir
done

===============================================

ChauhanTs
quelle
Wie überprüfe ich, ob DATEIEN leer sind und zeige die Nachricht auf dem Terminalbildschirm an und lege den Zielordner fest?
May'Habit
Ich ändere die Datei im Stammordner und führe Ihren Befehl aus. Es wird ein Ordner mit demselben Namen erstellt. Warum kopiert es keine Datei in einen anderen Ordner, sondern erstellt einen Ordner?
May'Habit