A resposta atualmente aceita é tecnicamente correta, você não pode dizer diretamente ao Git para enviar todos os seus stashes para um controle remoto e, em seguida, colocar tudo nos stashes locais em outro computador.
E embora a resposta atualmente com a votação superior deva funcionar, eu não gostei que ela crie várias ramificações temporárias e que exija verificar manualmente o commit do stash e salvá-lo como stash, o que pode levar a problemas como este comentário mencionado e leva a uma duplicata On (no branch): On testing:
. Certamente deve haver uma maneira melhor!
Portanto, embora você não possa enviar stash diretamente, um stash é apenas uma confirmação (na verdade, duas confirmações) e, de acordo com a git push
página de manual, você pode enviar confirmações por push:
A <src>
é muitas vezes o nome do ramo que você gostaria de empurrar, mas pode ser qualquer arbitrária "SHA-1 expressão" ...
Eu escolhi empurrar os esconderijos para refs/stashes/*
não bagunçar meu controle remoto com galhos extras. Então eu posso fazer isso com:
git push origin stash@{0}:refs/stashes/$(git rev-parse --short stash@{0})
(O rev-parse
comando obtém o pequeno hash do stash, que será exclusivo para o repositório.)
Em seguida, preciso buscar o esconderijo do outro computador. O Git apenas busca ramificações por padrão, então eu preciso buscar as stashes especificamente:
git fetch origin refs/stashes/*:refs/stashes/*
Agora, para converter o commit do stash novamente em um stash real. Como mencionado, embora eu pudesse verificar o commit, redefinição e armazenamento do stash normalmente, não gosto que exija etapas extras ou que não mantenha o estado do índice do stash. Eu estava procurando on-line uma maneira de fazer isso automaticamente, mas minha busca-falhou comigo. Finalmente, procurei na página de manual git stash
, onde encontrei o seguinte:
create
Crie um stash (que é um objeto de confirmação regular) e retorne seu nome de objeto, sem armazená-lo em qualquer lugar no espaço para nome ref. Isso pretende ser útil para scripts. Provavelmente não é o comando que você deseja usar; veja "salvar" acima.
store
Armazene um determinado stash criado via git stash create (que é uma confirmação de mesclagem pendente) na ref stash, atualizando o reflog do stash. Isso pretende ser útil para scripts. Provavelmente não é o comando que você deseja usar; veja "salvar" acima.
Desde que eu já tenho o commit, store
soa como o que eu quero. Então eu posso fazer:
git stash store --message "$(git show --no-patch --format=format:%s <SHA>)" <SHA>
Substituindo <SHA>
pelo esconderijo que acabou de ser buscado.
(O git show
comando obtém a mensagem de confirmação do stash commit, para ser usada como a mensagem do log stash.)
O stash agora aparece normalmente no meu repositório local:
$ git stash list
stash@{0}: On master: temp
...
Para limpar o controle remoto, os stashes podem ser excluídos do controle da seguinte maneira:
git push origin :refs/stashes/<SHA>
Este método também tem o benefício de ser idempotente: se você executar o push
comando novamente, ele será reportado Everything up-to-date
. O fetch
comando também pode ser executado com segurança repetidamente. Embora o stash store
arquivo pule o armazenamento do stash, se for o mesmo que o stash mais recente, ele não impede duplicatas de stash mais antigos. Isso pode ser contornado, como faço no meu git-rstash
script, veja abaixo.
Para concluir, você também pode enviar facilmente todos os stashes (com festança):
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
ou importe todos os stashes buscados:
for stash in $(ls .git/refs/stashes)
do
git stash store --message "$(git show --no-patch --format=format:%s $stash)" $stash
done
Eu criei um festançascript que pode ser chamado como subcomando (por exemplo git rstash push 0
), para que eu não precise me lembrar de tudo isso. git-rstash
pode ser encontrado aqui.
git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
ogit stash apply some-remote/stash
. Mas você não pode obter stashes mais antigos porque eles são armazenados no reflog que não é possível de ser obtido. Veja stackoverflow.com/questions/2248680/…