No git, é possível criar um stash, enviá-lo para um repositório remoto, recuperá-lo em outro computador e aplicá-lo?
Ou são minhas opções:
- Crie um patch e copie-o para outro computador ou
- Criar um ramo menor e confirmar o trabalho incompleto nesse ramo?
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/…Nota: Acabei de reescrever esta resposta com mais 24 horas de git-fu no meu currículo :) Na minha história de shell, todo o shebang agora é de três linhas. No entanto, não os condensamos para sua conveniência.
Dessa forma, espero que você possa ver como eu fiz as coisas, em vez de apenas ter que copiar / colar cegamente as coisas.
Aqui está passo a passo.
Suponha que a fonte seja ~ / OLDREPO contendo stashes. Crie um clone TEST que não contém stashes:
Empurre todos os stashes como ramificações temporárias:
Faça um loop na extremidade de recebimento para transformar novamente em stashes:
Limpe suas filiais temporárias se desejar
Faça uma lista stash do git e você terá algo assim:
No repositório original, parecia o mesmo
fonte
git add .
antes dagit stash save ...
etapa, poisgit stash
se recusa a esconder novos arquivos, a menos que eles tenham sido testados. Além disso, canalizando o resultadogit rev-list ...
atravéstac
inverte a ordem dos esconderijos assim que saem na mesma ordem.for
loop final comgit branch -D stash_$a
(limpar à medida que os stashes são criados) para que, se algo der errado e tentarmos novamente, não reprocessarmos os commit já armazenados com êxito.git stash save "$(git log --format='%s' -1 HEAD@{1})"
comgit update-ref --create-reflog -m "$(git show -s --format=%B $rev)" refs/stash $rev
você receber a mensagem esconderijo original (update-ref
é o quegit stash save
nos bastidores).Estou um pouco atrasado para a festa, mas acredito que encontrei algo que funciona para mim em relação a isso e que pode também para você se suas circunstâncias forem iguais ou semelhantes.
Estou trabalhando em um recurso em seu próprio ramo. O ramo não é mesclado no master e enviado até o término ou fiz compromissos que me sinto à vontade para mostrar ao público. Então, o que faço quando quero transferir alterações não-estágios para outro computador é:
[non-commit] FOR TRANSFER ONLY
", apresentando o conteúdo que você deseja transferir.Então faça:
git pull ssh+git://<username>@<domain>/path/to/project/ rb:lb
A URL pode ser diferente para você se você acessar seu repositório de uma maneira diferente. Isso puxará as alterações desse URL da ramificação remota "rb" para a ramificação local "lb". Observe que eu tenho um servidor ssh em execução no meu próprio computador e posso acessar o repositório dessa maneira.
git reset HEAD^
(implica--mixed
)Isso redefine o HEAD para apontar para o estado antes do commit "[não confirmado]".
From git-reset (1): "
--mixed
: redefine o índice, mas não a árvore de trabalho (ou seja, os arquivos alterados são preservados, mas não marcados para confirmação) [...]"Portanto, você terá suas alterações nos arquivos no final, mas nenhuma confirmação será feita no domínio e não haverá necessidade de esconderijo.
No entanto, isso exigirá que você faça
git reset --hard HEAD^
o repositório no qual você fez o "[non-commit]", pois esse commit é um lixo.fonte
É um pouco tarde, mas esta resposta pode ajudar alguém. Eu queria saber disso porque queria poder enviar um recurso em andamento / bug / qualquer coisa e trabalhar a partir do mesmo ponto em outro computador.
O que funciona para mim é confirmar meu código em andamento (em um ramo em que estou trabalhando sozinho). Quando chego ao meu outro computador, puxe e desfaça a confirmação com:
Continue trabalhando como estava, com todas as alterações em andamento lá, não confirmadas e sem estágio.
Espero que ajude.
fonte
Parece haver um truque muito interessante para resolver isso. você pode usar
git diff > file.diff
(e confirmar o arquivo) e, em seguida, restaurar as alterações usandogit apply file.diff
(de qualquer lugar) para obter o mesmo resultado.Isso foi explicado aqui também.
fonte
Eu iria com a segunda abordagem, embora não tenha idéia de por que você não pode comprometê-la no ramo principal / em destaque. Também é possível fazer a colheita de cerejas.
fonte
AFAIK, toda a idéia do esconderijo é esconder algo não tão importante sob o tapete local . Ninguém deve saber sobre sua porcaria favorita ;-) O único "mas" é: Mas se eu desenvolvo em algumas estações de trabalho? Então
scp
é muito melhor.fonte
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: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:(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:
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:Desde que eu já tenho o commit,
store
soa como o que eu quero. Então eu posso fazer: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:
Para limpar o controle remoto, os stashes podem ser excluídos do controle da seguinte maneira:
Este método também tem o benefício de ser idempotente: se você executar o
push
comando novamente, ele será reportadoEverything up-to-date
. Ofetch
comando também pode ser executado com segurança repetidamente. Embora ostash 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 meugit-rstash
script, veja abaixo.Para concluir, você também pode enviar facilmente todos os stashes (com festança):
ou importe todos os stashes buscados:
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.fonte
O seguinte não funciona com o stash, mas com as alterações não confirmadas no diretório de trabalho. Ele cria uma ramificação, confirma automaticamente todas as alterações atuais e envia para o controle remoto:
Use como:
fonte
Eu simplesmente criaria um novo ramo stash e o removeria sempre que esse ramo não for necessário.
fonte
Basta usar o Dropbox como esse cara. Dessa forma, você não precisa se preocupar em enviar stashes, pois todo o seu código seria copiado.
http://blog.sapegin.me/all/github-vs-dropbox
fonte