2011-01-04 5 views
3

Wenn ichWarum funktioniert git format-patch nicht für stashes?

git format-patch -1 [email protected]{0} 

git kehrt stumm, ohne die Schaffung jede Datei ausführen. Warum passiert das? Wie kann ich einen Stash in einem Format speichern, das mit git am kompatibel ist?

+0

Ich denke du meinst funktioniert 'Stash @ {0}' stattdessen 'git stash list' zeigt, dass als Name für mich. Wenn Sie nur stash {0} verwenden, wird ein Fehler bezüglich der nicht vorhandenen Revision zurückgegeben. Ich habe keine Antwort, warum es nicht funktioniert. – jonescb

+0

@jonescb: Richtig, das war nur ein Tippfehler, sorry dafür. – UncleZeiv

+0

Ich sollte wahrscheinlich erwähnen, dass ich im Moment git '1.6.6' verwenden muss. – UncleZeiv

Antwort

4

Dies scheint zu sein, weil das Stash-Commit als eine Zusammenführung dargestellt wird (zwischen seinem Eltern- und dem Index-Zustand zu der Zeit), und format-patch auf einem Merge-Commit tut nichts.

Wenn Sie sagen,

git format-patch [email protected]{0}{,^} 

dann wird es Flecken zwischen dem Versteck ausspucken und jedem Elternteil.

Zur Veranschaulichung ist das, was das Versteck wie folgt aussieht:

* 99aedb8 (refs/stash) WIP on master: 668ff36 initial commit 
|\ 
| * 6b8d77f index on master: 668ff36 initial commit 
|/ 
* 668ff36 (HEAD, master) initial commit 
+0

Ihre Argumentation macht Sinn, aber Ihre vorgeschlagene Lösung gibt immer noch ein leeres Commit. Wenn Sie andere Lösungen im Hinterkopf haben, beachten Sie bitte, dass es für mich in Ordnung ist, die Shadids der Commits direkt anstelle der Notation 'stash @ {0}' zu verwenden. – UncleZeiv

1

Sie

git stash show -p > ~/Desktop/stash.patch 

Dieser generiert eine Patch-Datei auf Ihrem Desktop für den neuesten Patch und dem ursprünglichen Elternteil versuchen könnte.

im documentation of git-stash unter der Show Option Beschrieben

+0

danke, ich bin mir dessen bewusst, aber ich war auf der Suche nach einer Möglichkeit, einen Patch zu generieren, der mit 'git am' kompatibel ist, und ich war neugierig, was ohnehin passiert. – UncleZeiv

+0

@unclezeiv Bist du irgendwie an "git am" gebunden oder kannst du 'git apply' verwenden? – Kelvin

0

ich 2 Möglichkeiten denken kann.

Lösung 1: Erstellen Sie einen Zweig aus dem Stash. Diese Art vereitelt den ursprünglichen Zweck der Stash-Funktion, die es vermeiden sollte, den separaten Zweig zu erstellen.

Lösung 2: Fügen Sie alle Änderungen zu den verfolgten Dateien dem Index hinzu, bevor Sie sie sichern. Führen Sie nach dem Verstecken

git format-patch '[email protected]{0}^1'..'[email protected]{0}^2' 

aus, die HEAD mit dem Index vergleicht (zu der Zeit, als der Stash erstellt wurde).

Ich bin mir nicht sicher, warum Sie nicht nur Dateien in den Index verlassen unadded und git format-patch '[email protected]{0}^1'..'[email protected]{0}'

, die wie die gleiche Sache scheint laufen. Es muss etwas Besonderes am Stash-Commit-Objekt geben. In jedem Fall werden beim Hinzufügen zum Index die Änderungen im zweiten übergeordneten Element des Stash (das Index-Commit) aufgezeichnet, wobei die Probleme mit dem Stash-Commit umgangen werden.

Misc Hinweise: git format-patch -1 wird immer leer für ein Merge-Commit (Stashes sind ein Spezialfall eines Merge-Commits). Ich bin nicht ganz sicher, warum das ist, aber siehe Git: How to create patches for a merge? für weitere Details.

-1

Wenn Ihre Dateien gebunkert verwenden git stash -u dann git stash show -p nicht

Verwandte Themen