Exportieren Sie einen Stash auf einen anderen Computer


296

Ich brauche eine Möglichkeit, eine versteckte Änderung auf einen anderen Computer zu exportieren.

Auf Computer1 habe ich

$ git stash save feature

Ich versuche, den Stash-Patch in eine Datei zu bringen und ihn dann auf einen anderen Computer zu importieren

$ git stash show -p > patch

Dieser Befehl gibt mir eine Datei, die ich auf einen anderen Computer verschieben kann, auf dem dieses Repo geklont wird. Die Frage ist jedoch, wie es wieder als Stash importiert werden kann.

Vielen Dank


6
fyi git stash saveist jetzt zugunsten vongit stash push
Ewan

Antworten:


290

Sie können eine Patch-Datei anwenden (ohne die Änderungen noch zu übernehmen), indem Sie sie einfach ausführen

git apply patchfile

Dann können Sie einfach einen neuen Stash aus dem aktuellen Arbeitsverzeichnis erstellen:

git stash

2
@Marcelo A: Gut zu hören, aber bitte markieren Sie Antworten, die Sie als solche akzeptiert haben, indem Sie auf das große Häkchen unter der Abstimmungsnummer der Antwort klicken. Auf diese Weise wird Ihre Frage als gelöst markiert.
stupsen

2
Beachten Sie, dass das System das OP eine Antwort erst dann als "akzeptiert" markieren lässt, wenn einige Zeit (glaube ich 15 Minuten) seit dem Zeitpunkt vergangen ist, an dem die Frage gestellt wurde.
Greg Hewgill

23
Nachdem ich diese Antwort gelesen hatte, fragte ich mich, wie ich aus all meinen Verstecken einen bestimmten Vorrat auswählen sollte. Die Antwort darauf finden Sie hier: stackoverflow.com/a/1910142/1148702 . In diesem Fall habe ich Folgendes getan: git stash show "stash@{0}" -p > patchanstelle des zweiten Shell-Befehls des OP.
Tim Camber

1
@ TimCamber Ich glaube nicht, dass Sie die doppelten Anführungszeichen brauchen stash@{0}..
Ari Gold

2
@arigold Hängt von der verwendeten Shell ab. In PowerShell benötigen Sie sie beispielsweise, da geschweifte Klammern dort eine spezielle Syntax darstellen.
stupsen

18

Alternativ können Sie einen Zweig aus Ihrem Vorrat (auf Computer 1) mit erstellen

git stash branch stashed_changes_branch

Übernehmen Sie Ihre Änderungen:

git commit -a

Fügen Sie es dann als Fernbedienung auf Computer 2 hinzu:

git remote add pc1 user@computer1:/path/to/repo

Jetzt können Sie die Remote-Informationen mit abrufen

git fetch pc1

Jetzt können Sie das Commit wie gewünscht importieren. Verwenden von Git Cherry-Pick , Git Rebase oder was auch immer Sie möchten ... Wenn Sie möchten, dass es so aussieht, als hätten Sie gerade Git Stash angewendet ; Sie können Git Cherry-Pick --no-Commit verwenden.


Wenn Sie keine direkte Verbindung zwischen Computer1 und Computer2 haben; Sie können eine Fernbedienung verwenden (wie Github oder ähnliches):

git push origin stashed_changes_branch

und auf Computer2:

git fetch

1
Dies setzt voraus, dass das Quellsystem (Computer1) offen ist, um externe Verbindungen zu empfangen, was für die meisten Leute, die hier landen, wahrscheinlich nicht wahr ist. Wenn Sie die Verzweigungsroute gehen möchten, warum schieben Sie nicht einfach eine temporäre Verzweigung zum Remote-Ursprung und ziehen diese von Computer2? Sie können den Remote-Zweig löschen, sobald Sie ihn gezogen haben, wenn Sie ihn nicht behalten möchten. Zweige in Git sind so billig, dass es normalerweise nur wenige Gründe gibt, sie nicht zu verwenden.
unteilbar

@indivisible Ich bin anderer Meinung, dass es heute viele Möglichkeiten gibt, zwei Computer im Internet zu verbinden. Die in der Antwort beschriebene Technik kann nützlich sein, um eine laufende Arbeit von einem Laptop auf einen Desktop in einem LAN zu übertragen. Sogar ein virtueller VPN-Dienst wie Hamachi würde verwendet, um Dateien über das Internet überall direkt zwischen Computern zu übertragen, auf denen git ausgeführt wird.
Steampowered

1
@steampowered, sicher , es kann für manche Menschen / Situationen wahr sein , aber ich dachte , es einen Punkt erwähnenswert, für die Leser Zukunft , da es eine harte Anforderung für diese Lösung zu arbeiten und Ihr lokalen env / System modifizieren eingehenden Datenverkehr zu akzeptieren , nimmt nicht trivial Konfiguration Das ist meiner Meinung nach "Overkill" für eine solche Aufgabe. Wenn Ihre Systeme bereits geöffnet sind, verwenden Sie diese Antwort auf jeden Fall - sie ist nicht falsch. Ich habe nur das Gefühl, dass die Mehrheit der Benutzer, die hier landen, nicht in einer solchen Situation sein wird.
unteilbar

Stashes sind Commit-Objekte und haben daher bereits einen Commit-Hash (siehe git stash list --oneline), sodass Sie den Stash technisch nicht auf ein neues Commit-Objekt anwenden müssen. Mit anderen Worten, das Erstellen eines neuen Zweigs ist nicht erforderlich. Es ist jedoch, gelinde gesagt, schwierig, einen Stash direkt auf eine Fernbedienung zu übertragen.
Tyler Crompton

15

Alternativ können Sie die gesamten lokalen Stashes wie folgt in einen anderen Computer exportieren

  • git pull in Ihrem alten und neuen Git-Verzeichnis, um sicherzustellen, dass beide die neuesten Änderungen haben.
  • Kopieren Sie den Ordner .git aus dem alten Git-Verzeichnis in das neue Repository

1
Obwohl der komprimierte Teer von .git 700M + betrug, stellte sich heraus, dass dies weitaus einfacher war als die anderen vorgeschlagenen Lösungen, zumal ich mehrere Verstecke hatte.
Chris Warth

5

So exportieren Sie Stash in SourceTree:

  1. Erstellen Sie einen neuen Zweig "StashTransfer" aus einem Zweig, in dem Sie Ihren Stash verwenden möchten
  2. Wenden Sie Ihren Vorrat darauf an und machen Sie ein Commit

  3. Klicken Sie auf Ihr Commit und erstellen Sie einen Patch daraus. Nehmen Sie die Patch-Datei mit.

  4. Gehen Sie zu einem anderen Repository und wählen Sie denselben übergeordneten Zweig aus, den Sie gerade in 1) verwendet haben.

  5. Aktionen / Patch anwenden, wählen Sie Modus: Arbeitskopiedateien ändern, klicken Sie auf Patch anwenden, wenn Sie in Ihrer aktuellen Arbeitsumgebung nicht festgeschriebene Änderungen am Patch vorgenommen haben

  6. Erstellen Sie einen neuen Stash für das aktuelle Repo


4

Sie können Stash als Patch-Datei von einem Computer aus erstellen und diese Patch-Datei dann für andere Computer freigeben.

Erstellen des Stashs als Patch

$ git stash show "stash@{0}" -p > changes.patch

Das "stash @ {0}" ist die Referenz des stash. Es wird eine Patch-Datei mit dem neuesten Stash erstellt. Wenn Sie einen anderen Befehl wünschen, verwenden Sie den Befehl $ git stash list, um Ihre Liste der Stashes anzuzeigen und auszuwählen, welchen Sie patchen möchten.

Anwenden des Patches

Übertragen Sie diesen Stash nun auf einen anderen Computer und fügen Sie ihn in den Stammordner Ihres Projekts ein. Führen Sie dann diesen Befehl aus

$ git apply changes.patch

Wenn ein Fehler vorliegt und Sie die Änderung rückgängig machen möchten

$ git apply changes.patch --reverse

3

Eine andere Option ist rsyncder .gitOrdner von einem Computer zu einem anderen Computer. rsyncverarbeitet nur Dateiänderungen (schneller als eine Kopie).

Ein Nachteil dieses Ansatzes ist, dass die Konfigurationen ebenfalls überschrieben werden. Dies ist möglicherweise nicht erwünscht, wenn Sie unterschiedliche .git-Konfigurationen zwischen den beiden Computern ausführen. Sie können dies jedoch überwinden, indem Sie Dateien mit der --excludeOption in ausschließen rsync.

Insgesamt denke ich, dass eine native Git-Lösung sauberer ist, aber dieser rsyncHack könnte für jemanden in Eile nützlich sein, der mit rsync besser vertraut ist als mit git.


3

Der Startbefehl aus dem ursprünglichen Beitrag:

git stash show -p stash@{x} > patch_file

hat bei mir nicht funktioniert (aus irgendeinem Grund wurden unbrauchbare Patch-Dateien erstellt). Stattdessen musste ich:

git stash apply stash@{x}
git commit

für jeden Vorrat wollte ich übertragen. Dann habe ich das 'Eltern'-Repo in die Datei: /// Reichweite des' Kind'-Repos gelegt und für jedes Stash-Commit Folgendes ausgeführt:

git fetch file:///path_to_parent_git && git cherry-pick commit_sha
git reset --soft HEAD^
git stash save my_new_stash_on_child

Das ist komplexer, hat aber den Trick für mich getan.


0

Wenn Sie Ihre Änderungen von einem Computer auf einen anderen verschieben möchten, können Sie Ihre Änderungen jederzeit auf Ihrem Computer festschreiben und dann einen Soft-Reset auf dem Computer durchführen.

Büro

git commit -m "-stash-"

Küche

git reset --soft HEAD~1


0

Ein Stash ist ein spezielles Zusammenführungs-Commit des Arbeitsbaums zwischen dem Basis-Commit und dem Index. Eine Möglichkeit könnte darin bestehen, jedes Patch als separate Patches zu speichern, das erste übergeordnete Stash auszuchecken, den Index und den Arbeitsbaum aus den beiden Patches wiederherzustellen und schließlich das Stash wiederherzustellen (anscheinend geht eine Antwort in diese Richtung).

Dies ist erforderlich, um alle Informationen aus dem Stash vollständig neu zu erstellen. Wenn Sie sich nicht darum kümmern, sollten Sie zumindest das erste übergeordnete Element des Stashs vor dem Wiederherstellen auschecken, um Konflikte zu vermeiden und zu verfolgen, wo der Stash erstellt wurde.

Dies ist, was ich getan habe, um alle Verstecke von einem Repo zum anderen vollständig wiederherzustellen. Wenn Sie sie nicht auf demselben Computer haben können, können Sie die Stash-Tags nach dem Erstellen in einem Bundle speichern und die Refs-Liste und das Bundle auf den Zielcomputer kopieren.

Aus der Wurzel des ursprünglichen Repos:

  1. Holen Sie sich die Liste der Stash Refs
  2. Kennzeichnen Sie Ihre Stash-Refs, damit Sie sie mit git fetch abrufen können (die Tag-Namen spielen keine Rolle, ändern Sie sie, wenn ein Konflikt vorliegt. Ich habe verwendet stash_ + die Nummer (n) in der logischen Stash-Ref verwendet).
  3. Konvertieren Sie die logischen Referenzen in sha1-Hashes in umgekehrter Reihenfolge - wir werden sie später verwenden
  4. Speichern Sie diesen Repo-Pfad - auch für später
refs=$(git stash list|cut -d: -f1)
for ref in $refs; do tag stash_${ref//[^0-9]} $ref; done
refs=$(git rev-parse $refs|tac)
oldpath=$PWD

NB: Dies erfordert Bash oder eine kompatible Shell (ksh, zsh sollte ...). Sie können auch eine Variable erhöhen, z stash_$((i++)) B. wenn Ihre Shell dies nicht unterstützt${param//pattern}

Jetzt im neuen Repo für jede Referenz:

  1. Holen Sie sich den Ref aus dem alten Repo (wir müssen nicht einmal die Tag-Namen verwenden, da wir sie markiert haben, können wir sie mit git fetch abrufen)
  2. Importieren Sie den Stash erneut aus dem Ref, wobei Sie den Betreff dieses Ref als Stash-Nachricht verwenden.
for ref in $refs; do git fetch $oldpath $ref; git stash store -m "$(git show -s --pretty=%s $ref)" $ref; done
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.