Exportar um stash para outro computador

296

Preciso de uma maneira de exportar uma alteração oculta para outro computador.

No Computer1 eu fiz

$ git stash save feature

Estou tentando obter o patch oculto em um arquivo e importá-lo para outro computador

$ git stash show -p > patch

Este comando fornece um arquivo que eu posso mover para outro computador em que esse repositório é clonado, mas a questão é como importá-lo como um esconderijo novamente.

obrigado

Marcelo A
fonte
6
fyi git stash saveagora está obsoleto em favor degit stash push
Ewan

Respostas:

290

Você pode aplicar um arquivo de correção (sem confirmar as alterações ainda) simplesmente executando

git apply patchfile

Em seguida, você pode simplesmente criar um novo stash a partir do diretório de trabalho atual:

git stash
cutucar
fonte
2
@ Marcelo R: É bom ouvir isso, mas marque as respostas que você aceitou como tal, clicando na grande marca de seleção abaixo do número de votação da resposta. Dessa forma, sua pergunta será marcada como resolvida.
Poke
2
Observe que o sistema não permitirá que o OP marque uma resposta como "aceita" até que algum tempo (15 minutos, eu acho) tenha decorrido desde o momento em que a pergunta foi feita.
Greg Hewgill 19/10/10
23
Depois de ler esta resposta, uma coisa que eu queria saber era como selecionar um esconderijo específico de todos os meus esconderijos. A resposta para isso está aqui: stackoverflow.com/a/1910142/1148702 . Nesse caso, acabei fazendo: em git stash show "stash@{0}" -p > patchvez do segundo comando shell do OP.
precisa
1
@TimCamber eu não acho que você precisa as aspas em torno stash@{0}..
ouro ari
2
@arigold Depende do shell que você está usando. Por exemplo, no PowerShell, você precisa deles, pois os chavetas são uma sintaxe especial.
cutuca
18

Como alternativa, você pode criar uma ramificação a partir do seu esconderijo (no computador 1), usando

git stash branch stashed_changes_branch

comprometa suas alterações:

git commit -a

adicione-o como um controle remoto no computador 2:

git remote add pc1 user@computer1:/path/to/repo

agora você pode recuperar as informações remotas usando

git fetch pc1

agora você pode importar o commit da maneira que desejar; usando git cherry-pick , git rebase ou o que você quiser ... Se você quer que pareça que você acabou de aplicar o git stash ; você pode usar o git cherry-pick --no-commit.


Se você não tem conexão direta entre computer1 e computer2; você pode usar um controle remoto (como o github ou algo semelhante):

git push origin stashed_changes_branch

e no computer2:

git fetch
Chris Maes
fonte
1
Isso pressupõe que o sistema de origem (computador1) esteja aberto para receber conexões externas que, para a maioria das pessoas que chegam aqui, provavelmente não são verdadeiras. Se você deseja seguir a rota da ramificação, por que não simplesmente enviar uma ramificação temporária para a origem remota e puxar isso do computer2? Você pode excluir a ramificação remota assim que for puxada, se não quiser mantê-la por perto. Ramos no git são tão baratos que geralmente existem poucas razões para não usá-los.
indivisível
@indivisible Eu discordo, existem muitas oportunidades para conectar dois computadores na internet hoje. A técnica descrita na resposta pode ser útil para transferir um trabalho em andamento de um laptop para um desktop em uma LAN. Até um serviço vpn virtual como o Hamachi seria usado para transferir arquivos pela Internet em qualquer lugar diretamente entre computadores executando o git.
steampowered
1
@steampowered, com certeza pode ser verdade para algumas pessoas / situações, mas achei um ponto digno de nota para futuros leitores, pois é um requisito difícil que esta solução funcione e modificar seu ambiente / sistema local para aceitar o tráfego de entrada requer uma configuração não trivial isso, na minha opinião, é "exagero" para uma tarefa como esta. Se o seu sistema já estiver aberto, use esta resposta por todos os meios - não está incorreto. Eu apenas sinto que a maioria dos usuários que chegam aqui não estará em uma situação como essa.
indivisível
Stashes são objetos de confirmação e, portanto, já possuem um hash de confirmação (consulte git stash list --oneline), portanto, tecnicamente, você não precisa aplicar o stash a um novo objeto de confirmação. Em outras palavras, a criação de uma nova ramificação não é necessária. No entanto, empurrar um esconderijo diretamente para um controle remoto é complicado, para dizer o mínimo.
Tyler Crompton
15

Como alternativa, você pode exportar os stashes locais inteiros para outro compter da seguinte maneira

  • git pull no seu diretório antigo e novo, para garantir que ambos tenham as alterações mais recentes.
  • copie a pasta .git do diretório git antigo para o novo repositório
shafeeq
fonte
1
Embora o tar compactado do .git fosse 700M +, isso acabou sendo muito mais fácil do que as outras soluções propostas, especialmente porque eu tinha vários stashes.
31519 Chris Warth
5

Como exportar o Stash no SourceTree:

  1. Faça um novo ramo "StashTransfer" a partir de um ramo em que você usará o seu Stash
  2. Aplique seu esconderijo e faça um commit

  3. Clique no seu commit e faça um patch, leve o arquivo do patch com você.

  4. Vá para um repositório diferente, selecione o mesmo ramo pai que você acabou de usar 1)

  5. Ações / Aplicar patch, selecione Modo: modificar arquivos de cópia de trabalho, pressione Aplicar patch agora que você tem modificações não confirmadas do patch no seu ambiente de trabalho atual

  6. Faça um novo Stash para o repo atual

KEMBL
fonte
4

Você pode criar stash como arquivo de correção de uma máquina e depois compartilhar esse arquivo de correção com outras máquinas.

Criando o stash como um patch

$ git stash show "stash@{0}" -p > changes.patch

O "stash @ {0}" é o ref do stash. Ele criará um arquivo de patch com o stash mais recente. Se você deseja um diferente, use o comando $ git stash listpara ver sua lista de stashes e selecione qual deles deseja corrigir.

Aplicando o patch

Agora transfira esse esconderijo para outra máquina e cole-o na pasta raiz do seu projeto. Em seguida, execute este comando

$ git apply changes.patch

Se houver erro e você desejar reverter a alteração

$ git apply changes.patch --reverse
Sam
fonte
3

Outra opção é rsynca .gitpasta de um computador para outro. rsyncprocessa apenas alterações de arquivo (mais rápido que uma cópia).

Uma desvantagem dessa abordagem é que as configurações também seriam substituídas, o que pode não ser desejado se você executar configurações diferentes do .git entre as duas máquinas. Mas você pode superar isso excluindo arquivos com a --excludeopção emrsync .

No geral, acho que uma solução nativa do Git é mais limpa, mas esse rsynctruque pode ser bom para alguém com pressa que possa estar mais familiarizado com o rsync do que com o git.

a vapor
fonte
3

O comando de inicialização da postagem original:

git stash show -p stash@{x} > patch_file

não funcionou para mim (por algum motivo, ele criou arquivos de correção inutilizáveis). Em vez disso, tive que:

git stash apply stash@{x}
git commit

para cada quantidade que eu queria transferir. Em seguida, coloquei o repositório 'pai' no arquivo: /// alcance do repositório 'filho' e fiz o seguinte para cada confirmação de stash:

git fetch file:///path_to_parent_git && git cherry-pick commit_sha
git reset --soft HEAD^
git stash save my_new_stash_on_child

Isso é mais complexo, mas fez o truque para mim.

pizon
fonte
0

Se você deseja mover suas alterações de uma máquina para outra, sempre pode confirmar as alterações na máquina e fazer uma reinicialização suave na máquina.

Escritório

git commit -m "-stash-"

Cozinha

git reset --soft HEAD~1

Siriquelle
fonte
0

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:

  1. Obtenha a lista de stash refs
  2. 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)
  3. Converter as referências lógicas em hashes sha1 na ordem inversa - nós as usaremos mais tarde
  4. 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:

  1. Busque a ref do repositório antigo (nem precisamos usar os nomes das tags, porque, se as etiquetamos, podemos recuperá-las com git fetch)
  2. 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
Thomas Guyot-Sionnest
fonte