La risposta attualmente accettata è tecnicamente corretta, non puoi dire direttamente a Git di trasferire tutti i tuoi stash su un telecomando, quindi inserire tutto nei tuoi stash locali su un altro computer.
E mentre la risposta attualmente top-up dovrebbe funzionare, non mi è piaciuto che crea un mucchio di rami temporanei e che richiede il controllo manuale dello stash commit e il salvataggio come stash, il che può portare a problemi come questo commento menzionato e porta a un duplicato On (no branch): On testing:
. Sicuramente ci deve essere un modo migliore!
Quindi, sebbene non sia possibile inviare direttamente gli stash, uno stash è solo un commit (in realtà due commit), e per la git push
pagina man è possibile eseguire il push dei commit:
Il <src>
è spesso il nome del ramo che si vorrebbe per spingere, ma può essere qualsiasi arbitraria "SHA-1" ...
Ho scelto di spingere gli stash in refs/stashes/*
modo da non ingombrare il mio telecomando con rami extra. Quindi posso farlo con:
git push origin stash@{0}:refs/stashes/$(git rev-parse --short stash@{0})
(Il rev-parse
comando ottiene il breve hash dello stash, che sarà unico per il repository.)
Successivamente, devo recuperare la scorta dall'altro computer. Git recupera solo i rami per impostazione predefinita, quindi ho bisogno di recuperare specificamente gli stash:
git fetch origin refs/stashes/*:refs/stashes/*
Ora per riconvertire lo stash commit in uno stash reale. Come accennato, mentre potevo semplicemente controllare lo stash commit, ripristinare e stash come al solito, non mi piace che richieda passaggi aggiuntivi o che potrebbe non mantenere lo stato dell'indice per lo stash. Stavo cercando online un modo per farlo automaticamente, ma la mia ricerca non mi ha fallito. Alla fine ho cercato nella pagina man git stash
dove ho trovato questo:
create
Crea uno stash (che è un oggetto commit regolare) e restituisce il nome dell'oggetto, senza memorizzarlo in nessun punto dello spazio dei nomi ref. Questo è utile per gli script. Probabilmente non è il comando che vuoi usare; vedi "salva" sopra.
store
Memorizza un dato stash creato tramite git stash create (che è un commit merge penzolante) nel ref stash, aggiornando il reflog stash. Questo è utile per gli script. Probabilmente non è il comando che vuoi usare; vedi "salva" sopra.
Dal momento che ho già il commit, store
suona come quello che voglio. Quindi posso fare:
git stash store --message "$(git show --no-patch --format=format:%s <SHA>)" <SHA>
Sostituendo <SHA>
con la scorta che è stata appena recuperata.
(Il git show
comando ottiene il messaggio di commit dal commit stash, da usare come messaggio per il registro stash.)
Lo stash ora appare normalmente nel mio repository locale:
$ git stash list
stash@{0}: On master: temp
...
Per ripulire il telecomando, gli stash possono essere eliminati dal telecomando in questo modo:
git push origin :refs/stashes/<SHA>
Questo metodo ha anche il vantaggio di essere idempotente: se si esegue di push
nuovo il comando, verrà segnalato Everything up-to-date
. Il fetch
comando può anche essere eseguito ripetutamente in modo sicuro. Mentre stash store
salterà la memorizzazione dello stash se è lo stesso dello stash più recente, non impedisce i duplicati degli stash più vecchi. Questo può essere risolto però, come faccio nella mia git-rstash
sceneggiatura, vedi sotto.
Per il completamento, puoi anche spingere facilmente tutti gli stash (con 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
o importa tutti gli stetch recuperati:
for stash in $(ls .git/refs/stashes)
do
git stash store --message "$(git show --no-patch --format=format:%s $stash)" $stash
done
Ho creato un bashscript che può essere chiamato come sottocomando (ad esempio git rstash push 0
), quindi non devo ricordare tutto questo. git-rstash
può essere trovato qui
git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
ilgit stash apply some-remote/stash
. Ma non puoi ottenere stash più vecchi perché sono memorizzati nel reflog che non è intercettabile. Vedere stackoverflow.com/questions/2248680/...