Ein Stash ist ein spezieller Merge-Commit des Arbeitsbaums zwischen dem Basis-Commit und dem Index. Eine Möglichkeit wäre, beide als separate Patches zu speichern, den Stash als erstes Elternteil auszuchecken, den Index und den Arbeitsbaum aus den beiden Patches wiederherzustellen und schließlich den Stash wiederherzustellen (eine Antwort scheint diesen Weg zu gehen).
Dies ist erforderlich, um alle Informationen aus dem Vorrat vollständig wiederherzustellen. Wenn Ihnen das nicht wichtig ist, sollten Sie vor der Wiederherstellung zumindest den ersten übergeordneten Ordner des Vorrats auschecken, um Konflikte zu vermeiden und den Überblick darüber zu behalten, wo der Vorrat erstellt wurde.
Das habe ich gemacht, um alle Stashes von einem Repo zum anderen wiederherzustellen. Wenn Sie sie nicht auf demselben Computer haben können, können Sie die Stash-Tags in einem Bundle speichern, nachdem Sie sie erstellt haben, und die Referenzliste und das Bundle auf den Zielcomputer kopieren.
Von der Wurzel des ursprünglichen Repo:
- Abrufen der Liste der Verstecknachweise
- Markieren Sie Ihre Stash-Referenzen, damit Sie sie mit git fetch abrufen können (der Tag-Name spielt keine Rolle, ändern Sie ihn, wenn es einen Konflikt gibt. Ich benutze
stash_
+ die Nummer(n) im logischen Versteck ref)
- Konvertieren der logischen Referenzen in sha1-Hashes in umgekehrter Reihenfolge - wir werden sie später verwenden
-
Speichern Sie den Repo-Pfad - auch für später
refs=$(git stash list|cut -d: -f1)
for ref in $refs; do git tag stash_${ref//[^0-9]} $ref; done
refs=$(git rev-parse $refs|tac)
oldpath=$PWD
NB: Dies erfordert die Bash oder eine kompatible Shell (ksh, zsh sollten genügen...) Sie könnten auch eine Variable inkrementieren, z.B. stash_$((i++))
wenn Ihre Shell keine Unterstützung für ${param//pattern}
In dem neuen Repo wird nun für jede Ref:
- Holen Sie die Refs aus dem alten Repo (wir müssen nicht einmal die Tag-Namen verwenden, da wir sie mit Tags versehen haben, können wir sie mit git fetch abrufen)
-
Importieren Sie den Stash erneut aus dem Ref, wobei Sie den Betreff des Refs 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