Um stash é um commit de mesclagem especial da árvore de trabalho entre o commit de base e o índice. Uma maneira poderia ser salvar cada um como patches separados, fazer check-out do primeiro pai do stash, restaurar o índice e a árvore de trabalho dos dois patches e finalmente restaurar o stash (parece que uma resposta é dessa maneira).
Isso é necessário para recriar completamente todas as informações do stash, e se você não se importa com isso, deve fazer o checkout mínimo do primeiro pai do stash antes de restaurar para evitar conflitos e acompanhar onde o stash foi criado.
Foi o que fiz para restaurar totalmente todos os stashes de um repositório para outro. Se você não puder tê-los no mesmo computador, poderá salvar as tags stash em um pacote configurável após criá-las e copiar a lista de referências e o pacote configurável no computador de destino.
Da raiz do repositório original:
- Obtenha a lista de stash refs
- Marque suas referências stash para poder recuperá-las com git fetch (os nomes das marcas não são importantes, altere-os se houver um conflito.
stash_ + os números na ref stash lógica)
- Converter as referências lógicas em hashes sha1 na ordem inversa - nós as usaremos mais tarde
- Salve esse caminho de repo - também para mais tarde
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: Isso requer shell bash ou compatível (ksh, zsh deve fazer ...) Você também pode incrementar uma variável, por exemplo, stash_$((i++))se seu shell não suportar${param//pattern}
Agora no novo repositório, para cada ref:
- Busque a ref do repositório antigo (nem precisamos usar os nomes das tags, porque, se as etiquetamos, podemos recuperá-las com git fetch)
- Reimporte o stash da ref, usando o assunto desse ref como a mensagem stash.
for ref in $refs; do git fetch $oldpath $ref; git stash store -m "$(git show -s --pretty=%s $ref)" $ref; done
git stash saveagora está obsoleto em favor degit stash push