Esporta una scorta su un altro computer


296

Ho bisogno di un modo per esportare una modifica nascosta su un altro computer.

Su Computer1 l'ho fatto

$ git stash save feature

Sto cercando di ottenere la patch stash in un file e quindi importarla su un altro computer

$ git stash show -p > patch

Questo comando mi dà un file che posso spostare su un altro computer in cui questo repository è clonato, ma la domanda è come importarlo di nuovo come scorta.

Grazie


6
fyi git stash saveè ora deprecato in favore digit stash push
Ewan

Risposte:


290

È possibile applicare un file patch (senza ancora confermare le modifiche) semplicemente eseguendo

git apply patchfile

Quindi puoi semplicemente creare una nuova scorta dalla directory di lavoro corrente:

git stash

2
@Marcelo A: Buono a sapersi, ma contrassegnare le risposte accettate come tali facendo clic sul segno di spunta grande sotto il numero di voto della risposta. In questo modo la tua domanda verrà contrassegnata come risolta.
colpì il

2
Si noti che il sistema non consentirà all'OP di contrassegnare una risposta come "accettata" fino a quando non è trascorso un certo tempo (15 minuti, credo) dal momento in cui è stata posta la domanda.
Greg Hewgill,

23
Dopo aver letto questa risposta, una cosa che mi chiedevo era come selezionare una scorta particolare da tutte le mie riserve. La risposta è qui: stackoverflow.com/a/1910142/1148702 . In questo caso ho finito per fare: git stash show "stash@{0}" -p > patchinvece del secondo comando shell dell'OP.
Tim Camber,

1
@TimCamber non penso che tu abbia bisogno delle doppie virgolette in giro stash@{0}..
ari gold

2
@arigold Dipende dalla shell che stai usando. Ad esempio in PowerShell, sono necessari poiché le parentesi graffe sono una sintassi speciale lì.
colpì il

18

in alternativa puoi creare un ramo dalla tua scorta (sul computer 1), usando

git stash branch stashed_changes_branch

confermare le modifiche:

git commit -a

quindi aggiungerlo come telecomando sul computer 2:

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

ora puoi recuperare le informazioni remote usando

git fetch pc1

ora puoi importare il commit nel modo che preferisci; usando git cherry-pick , git rebase o qualunque cosa ti piaccia ... Se vuoi che appaia, hai appena applicato git stash ; puoi usare git cherry-pick --no-commit.


Se non si dispone di una connessione diretta tra computer1 e computer2; puoi usare un telecomando (come github o qualcosa di simile):

git push origin stashed_changes_branch

e su computer2:

git fetch

1
Ciò presuppone che il sistema di origine (computer1) sia aperto a ricevere connessioni esterne che per la maggior parte delle persone che atterrano qui non è verosimilmente vero. Se vuoi seguire la rotta del ramo perché non spingere semplicemente un ramo temporaneo verso l'origine remota ed estrarlo dal computer2? È possibile eliminare il ramo remoto non appena è stato estratto, se non si desidera mantenerlo. I rami in git sono così economici che di solito ci sono pochi motivi per non usarli.
indivisibile,

@indivisible Non sono d'accordo sul fatto che oggi ci siano molte opportunità di connettere due computer su Internet. La tecnica descritta nella risposta potrebbe essere utile per trasferire un work in progress da un laptop a un desktop su una LAN. Anche un servizio VPN virtuale come Hamachi verrebbe utilizzato per trasferire file su Internet ovunque direttamente tra computer che eseguono git.
potenziato a vapore il

1
@steampowered, certo che potrebbe essere vero per alcune persone / situazioni, ma ho pensato che valesse la pena notare per i futuri lettori in quanto è un duro requisito per far funzionare questa soluzione e modificare il tuo ambiente / sistema locale per accettare il traffico in entrata richiede una configurazione non banale che, secondo me, è "eccessivo" per un compito come questo. Se i tuoi sistemi sono già aperti, usa sicuramente questa risposta - non è errata. Sento solo che la maggior parte degli utenti che atterrano qui non si troveranno in una situazione del genere.
indivisibile il

Gli stash sono oggetti di commit e quindi hanno già un hash di commit (vedi git stash list --oneline), quindi non devi tecnicamente applicare lo stash a un nuovo oggetto di commit. In altre parole, non è necessario creare un nuovo ramo. Tuttavia, spingere uno stash direttamente su un telecomando è a dir poco difficile.
Tyler Crompton,

15

In alternativa è possibile esportare gli interi stash locali su un altro elaboratore come segue

  • git pull sulla tua vecchia e nuova directory git per assicurarti che entrambe abbiano le ultime modifiche.
  • copia la cartella .git dalla vecchia directory git al nuovo repository

1
Sebbene il catrame compresso di .git fosse 700M +, questo si è rivelato molto più facile rispetto alle altre soluzioni proposte, soprattutto dal momento che avevo più scatti.
Chris Warth,

5

Come eseguire l'esportazione Stash in SourceTree:

  1. Crea un nuovo ramo "StashTransfer" da un ramo in cui utilizzerai il tuo Stash
  2. Applica la tua scorta e fai un commit

  3. Fai clic sul commit e creane una patch, porta con te il file patch.

  4. Vai a un altro repository, seleziona lo stesso ramo principale che hai appena usato in 1)

  5. Azioni / Applica patch, seleziona Modalità: modifica i file di copia funzionante, premi Applica patch ora hai apportato modifiche senza impegno dalla patch nel tuo attuale ambiente di lavoro

  6. Crea un nuovo Stash per il repository corrente


4

È possibile creare uno stash come file patch da un computer, quindi condividere quel file patch con un altro computer.

Creazione dello stash come patch

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

"Stash @ {0}" è il riferimento dello stash e creerà il file patch con lo stash più recente. Se si desidera uno diverso, utilizzare il comando $ git stash listper visualizzare l'elenco degli stash e selezionare quale si desidera correggere.

Applicare la patch

Ora trasferisci quella scorta su un altro computer e incollala nella cartella principale del tuo progetto. Quindi eseguire questo comando

$ git apply changes.patch

Se si verifica un errore e si desidera invertire la modifica

$ git apply changes.patch --reverse

3

Un'altra opzione è rsyncla .gitcartella da un computer a un altro computer. rsyncelabora solo le modifiche ai file (più veloci di una copia).

Un aspetto negativo di questo approccio è che le configurazioni sarebbero anche sovrascritte, il che potrebbe non essere desiderato se si eseguono configurazioni .git diverse tra le due macchine. Ma potresti superare questo escludendo i file con l' --excludeopzione in rsync.

Nel complesso, penso che una soluzione Git nativa sia più pulita, ma questo rsynctrucco potrebbe essere utile per qualcuno che ha fretta che potrebbe avere più familiarità con rsync che git.


3

Il comando di avvio dal post originale:

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

non ha funzionato per me (per qualche motivo ha creato file patch inutilizzabili). Invece ho dovuto:

git stash apply stash@{x}
git commit

per ogni scorta che volevo trasferire. Quindi, ho inserito il repository 'parent' nel file: /// reach del repository 'child' e ho fatto quanto segue, per ogni commit 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

Questo è più complesso, ma ha fatto il trucco per me.


0

Se si desidera spostare le modifiche da una macchina a un'altra, è sempre possibile eseguire il commit delle modifiche sulla propria macchina e quindi eseguire un ripristino software sulla propria macchina.

Ufficio

git commit -m "-stash-"

Cucina

git reset --soft HEAD~1


0

Uno stash è un commit di unione speciale dell'albero di lavoro tra il commit di base e l'indice. Un modo potrebbe essere quello di salvare ciascuno come patch separate, controllare il primo genitore di stash, ripristinare l'indice e l'albero di lavoro dalle due patch e infine ripristinare lo stash (sembra che una risposta vada in questo modo).

Ciò è necessario per ricreare completamente tutte le informazioni dallo stash e, se non ti interessa, dovresti almeno controllare il primo genitore dello stash prima di ripristinare per evitare conflitti e tenere traccia di dove lo stash è stato creato.

Questo è quello che ho fatto per ripristinare completamente tutti gli stash da un repository a un altro. Se non è possibile averli sullo stesso computer, è possibile salvare i tag stash in un bundle dopo averli creati e copiare l'elenco di riferimenti e raggrupparli nel computer di destinazione.

Dalla radice del repository originale:

  1. Ottieni l'elenco dei ref stash
  2. Tagga i tuoi ref stash in modo da poterli recuperare con git fetch (i nomi dei tag non sono rilevanti, cambiali in caso di conflitto. Ho usato stash_+ i numeri nel ref logico degli stash)
  3. Converti i riferimenti logici in hash sha1 in ordine inverso : li useremo in seguito
  4. Salvare quel percorso di repository, anche per dopo
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: Questo richiede bash o shell compatibile (ksh, zsh dovrebbe fare ...) Potresti anche incrementare una variabile, ad es. stash_$((i++))Se la tua shell non supporta${param//pattern}

Ora nel nuovo repository, per ogni riferimento:

  1. Recupera il riferimento dal vecchio repository (non abbiamo nemmeno bisogno di usare i nomi dei tag, perché li abbiamo taggati, possiamo recuperarli con git fetch)
  2. Reimportare lo stash dall'arbitro, usando l'oggetto di quell'arbitro come messaggio di stash.
for ref in $refs; do git fetch $oldpath $ref; git stash store -m "$(git show -s --pretty=%s $ref)" $ref; done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.