Kann ich eine Patch-kompatible Ausgabe von git-diff erhalten?

Lesezeit: 5 Minuten

Kann ich eine Patch kompatible Ausgabe von git diff erhalten
Michael Lorton

Ich mache etwas ganz einfaches falsch. Ich versuche, eine gewöhnliche Patch-Datei vorzubereiten, damit ich einige Änderungen erneut anwenden kann:

$ git diff > before
$ git diff something_here > save.patch
$ git checkout . 
$ patch < save.patch
$ git diff > after
$ diff before after
$

Mit something_here leer Es funktioniert fast, aber die Dateinamen stimmen nicht. Ich glaube, mir fehlt einfach eine Option.

Im wirklichen Leben werde ich nach dem Auschecken eine Zusammenführung durchführen, sodass der Patch dort möglicherweise fehlschlägt, aber Sie sehen, worauf ich hinaus will.

Bearbeiten
Meine Schuld hier, dass ich die falsche Frage gestellt habe. Die eigentliche Frage ist, ich möchte meine Änderungen speichern, zusammenführen und dann die Änderungen erneut anwenden, wenn möglich? Ich habe es falsch gefragt, weil ich es bin Gebraucht Patch verwenden, um diese Art von Problemen zu lösen und git diff sah so aus, als wollte es mich tun.

Charles Baileys Kommentar hatte die richtige Antwort. Für mich ist git-apply das Richtige (git-stash sieht schwergewichtiger aus, als ich brauche, und Rebasing und Bundles gehen definitiv über meine derzeitigen Fähigkeiten hinaus.) Ich werde die Antwort von Charles akzeptieren (weil du kann keinen Kommentar annehmen). Danke für alle Vorschläge.

Edit, 6 Jahre später
Wie jeder, der sich mit dem Thema auskennt, weiß, habe ich die Schwierigkeit überschätzt git stash. So ziemlich jeden Tag oder so werde ich die folgende Sequenz verwenden:

$ git stash
$ git merge
$ git stash pop

  • Gibt es einen Grund, den Sie speziell verwenden möchten? patch eher, als git apply ?

    – CB Bailey

    6. Januar 11 um 0:41 Uhr

  • Und selbst dann braucht man wirklich eher Patches als so etwas git stash oder andere Git-Tools?

    – CB Bailey

    6. Januar 11 um 0:43 Uhr

  • Posteditieren, das glaube ich git stash ist die einfachste Lösung für das, was Sie versuchen, aber es gibt viele Ansätze, die funktionieren.

    – CB Bailey

    6. Januar 11 um 1:26 Uhr

  • @Malvolio: In der Tat, Sie müssen nicht einmal an einen temporären Dateinamen denken, um Ihren Patch darin zu speichern.

    – CB Bailey

    6. Januar 11 um 12:15 Uhr

  • @Charlse, manchmal müssen Sie einen Patch an jemanden ohne das gesamte Git-Repository senden. Zum Beispiel bei der Verwendung git-svn.

    – Elazar Leibowitsch

    29. März 11 um 08:27 Uhr

Benutz einfach -p1: Sie müssen verwenden -p0 in dem --no-prefix Fall sowieso, also kannst du das einfach weglassen --no-prefix und verwenden -p1:

$ git diff > save.patch
$ patch -p1 < save.patch

$ git diff --no-prefix > save.patch
$ patch -p0 < save.patch

  • Wenn Sie sich fragen, warum, der mann docs fasst es gut zusammen – Quelle.

    – tutuDajuju

    25. Februar 16 um 15:28 Uhr

  • Dies funktioniert nicht mit Umbenennungen; git diff gibt eine Zeile aus, die patch ignoriert. git apply ist der Weg zu gehen.

    – hraban

    14. Januar 19 um 11:33 Uhr


Kann ich eine Patch kompatible Ausgabe von git diff erhalten
CB Bailey

Wenn Sie den Patch verwenden möchten, müssen Sie den entfernen a/ b/ Präfixe, die git standardmäßig verwendet. Sie können dies mit dem tun --no-prefix Option (Sie können dies auch mit Patch’s tun -p Möglichkeit):

git diff --no-prefix [<other git-diff arguments>]

Normalerweise ist es jedoch einfacher, es direkt zu verwenden git diff und dann den Ausgang verwenden, um zu füttern git apply.

Meistens versuche ich die Verwendung von Textpatches zu vermeiden. Normalerweise ein oder mehrere temporäre Commits kombiniert mit Rebase, git stash und Bundles sind einfacher zu verwalten.

Für deinen Anwendungsfall denke ich das stash ist am besten geeignet.

# save uncommitted changes
git stash

# do a merge or some other operation
git merge some-branch

# re-apply changes, removing stash if successful
# (you may be asked to resolve conflicts).
git stash pop

  • git diff --no-prefix master > diff.patch und dann git checkout master patch -p0 < diff.patch

    – Natim

    18. November 14 um 10:41 Uhr

  • @Natim Für ultimative Sicherheit würde ich die Verwendung empfehlen patch --dry-run < diff.patch bevor der letzte Befehl ausgegeben wird.

    – ᴠɪɴᴄᴇɴᴛ

    20. Januar 16 um 21:55 Uhr

  • @ᴠɪɴᴄᴇɴᴛ was wäre der Vorteil davon? Da wir Git verwenden, ist es unwahrscheinlich, dass wir irgendetwas verlieren, oder?

    – Natim

    26. Januar 16 um 13:21 Uhr

  • @Natim Wie gesagt, nur für die ultimative Sicherheit, im Fehlerfall muss nichts rückgängig gemacht werden. Ich habe auch an Leute gedacht, die dies lesen und verwenden möchten patch außerhalb von git (vielleicht mit einer Patch-Datei, die von diff) in einem allgemeineren Anwendungsfall.

    – ᴠɪɴᴄᴇɴᴛ

    26. Januar 16 um 17:11 Uhr

  • Um einzuschließen Neu Dateien in Ihrem Patch müssen Sie Auch Fügen Sie “git diff –no-prefix –cached” in den Patch ein. Vielleicht gibt es einen besseren Weg?

    – Jamshid

    9. März 17 um 5:46 Uhr

Die Git-Diffs haben ein zusätzliches Pfadsegment, das den Dateipfaden vorangestellt ist. Sie können diesen Eintrag im Pfad entfernen, indem Sie -p1 mit Patch wie folgt angeben:

patch -p1 < save.patch

  1. Ich speichere das Diff des aktuellen Verzeichnisses (einschließlich nicht festgeschriebener Dateien) gegen den aktuellen HEAD.
  2. Dann können Sie die transportieren save.patch Datei wohin (einschließlich Binärdateien).
  3. Wenden Sie den Patch auf Ihrem Zielcomputer mit an git apply <file>

Hinweis: Es unterscheidet sich auch von den aktuell bereitgestellten Dateien.

$ git diff --binary --staged HEAD > save.patch
$ git reset --hard
$ <transport it>
$ git apply save.patch

1643913487 532 Kann ich eine Patch kompatible Ausgabe von git diff erhalten
langsamer Start

Ein nützlicher Trick, um das Erstellen temporärer Patch-Dateien zu vermeiden:

git diff | patch -p1 -d [dst-dir]

  • Genau das, was ich wollte. Funktioniert auch perfekt mit Stashes! git stash show -p stash@{3} | patch -p1 -d [dst-dir]

    – dtm

    7. April 17 um 15:51 Uhr

  • Genau das, was ich wollte. Funktioniert auch perfekt mit Stashes! git stash show -p stash@{3} | patch -p1 -d [dst-dir]

    – dtm

    7. April 17 um 15:51 Uhr

.

758750cookie-checkKann ich eine Patch-kompatible Ausgabe von git-diff erhalten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy