Die derzeit akzeptierte Antwort ist technisch korrekt. Sie können Git nicht direkt anweisen, alle Ihre Stashes auf eine Fernbedienung zu übertragen und dann alles in Ihre lokalen Stashes auf einem anderen Computer zu ziehen.
Und obwohl die aktuell am besten bewertete Antwort funktionieren sollte, hat es mir nicht gefallen, dass sie eine Reihe von temporären Zweigen erstellt und das Stash-Commit manuell überprüft und als Stash gespeichert werden muss, was zu Problemen wie diesem Kommentar führen kann erwähnt und führt zu einem Duplikat On (no branch): On testing:
. Sicher muss es einen besseren Weg geben!
Während Sie Stashes nicht direkt pushen können, ist ein Stash nur ein Commit (eigentlich zwei Commits), und pro git push
Manpage können Sie Commits pushen:
Das <src>
ist oft der Name des Zweigs, den Sie pushen möchten, aber es kann ein beliebiger "SHA-1-Ausdruck" sein ...
Ich entschied mich dafür, die Verstecke zu verschieben, refs/stashes/*
damit ich meine Fernbedienung nicht mit zusätzlichen Zweigen überfüllte. Also kann ich das machen mit:
git push origin stash@{0}:refs/stashes/$(git rev-parse --short stash@{0})
(Der rev-parse
Befehl erhält den kurzen Hash des Stashs, der für das Repo eindeutig ist.)
Als nächstes muss ich den Vorrat vom anderen Computer holen. Git ruft standardmäßig nur Zweige ab, daher muss ich die Stashes speziell abrufen:
git fetch origin refs/stashes/*:refs/stashes/*
Nun konvertieren Sie das Stash-Commit zurück in ein tatsächliches Stash. Wie bereits erwähnt, kann ich das Festschreiben, Zurücksetzen und Verstecken des Stashs zwar wie gewohnt überprüfen, es gefällt mir jedoch nicht, dass zusätzliche Schritte erforderlich sind oder der Indexstatus für das Stash möglicherweise nicht beibehalten wird. Ich habe online nach einer Möglichkeit gesucht, dies automatisch zu tun, aber mein Such-Fu hat mich gescheitert. Schließlich habe ich in der Manpage nachgesehen git stash
, wo ich Folgendes gefunden habe:
create
Erstellt einen Stash (ein reguläres Commit-Objekt) und gibt seinen Objektnamen zurück, ohne ihn irgendwo im ref-Namespace zu speichern. Dies soll für Skripte nützlich sein. Es ist wahrscheinlich nicht der Befehl, den Sie verwenden möchten. siehe "Speichern" oben.
Geschäft
Speichern Sie einen bestimmten Stash, der über git stash create (ein baumelndes Merge-Commit) erstellt wurde, in der Stash-Referenz und aktualisieren Sie das Stash-Reflog. Dies soll für Skripte nützlich sein. Es ist wahrscheinlich nicht der Befehl, den Sie verwenden möchten. siehe "Speichern" oben.
Da ich bereits das Commit habe, store
klingt es wie das, was ich will. Also kann ich tun:
git stash store --message "$(git show --no-patch --format=format:%s <SHA>)" <SHA>
Ersetzen <SHA>
durch das gerade abgerufene Versteck.
(Das git show
Befehl ruft die Festschreibungsnachricht aus dem Stash-Commit ab, um sie als Nachricht für das Stash-Protokoll zu verwenden.)
Der Vorrat wird jetzt wie gewohnt in meinem lokalen Repo angezeigt:
$ git stash list
stash@{0}: On master: temp
...
Um die Fernbedienung zu bereinigen, können die Verstecke wie folgt von der Fernbedienung gelöscht werden:
git push origin :refs/stashes/<SHA>
Diese Methode hat auch den Vorteil, dass sie idempotent ist: Wenn Sie den push
Befehl erneut ausführen , wird er gemeldet Everything up-to-date
. Der fetch
Befehl kann auch sicher wiederholt ausgeführt werden. Während das stash store
Speichern des Stashs übersprungen wird, wenn es mit dem letzten Stash identisch ist, werden Duplikate älterer Stashes nicht verhindert. Dies kann jedoch umgangen werden, wie ich es in meinem git-rstash
Skript tue , siehe unten.
Zum Abschluss können Sie auch einfach alle Verstecke schieben (mit Bash):
for i in $(seq 0 $(expr $(git rev-list --walk-reflogs --count stash) - 1))
do
git push origin stash@{$i}:refs/stashes/$(git rev-parse --short stash@{$i})
done
oder importiere alle abgerufenen Stashes:
for stash in $(ls .git/refs/stashes)
do
git stash store --message "$(git show --no-patch --format=format:%s $stash)" $stash
done
Ich habe eine erstellt BashSkript, das als Unterbefehl aufgerufen werden kann (z. B. git rstash push 0
), damit ich mich nicht an all das erinnern muss. git-rstash
finden Sie hier.
git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
dasgit stash apply some-remote/stash
. Sie können jedoch keine älteren Stashes erhalten, da diese im Reflog gespeichert sind, das nicht abgerufen werden kann. Siehe stackoverflow.com/questions/2248680/…