2010-01-29 21 views
5

Ho appena iniziato a utilizzare git e sono impressionato dalle differenze del flusso di lavoro di SVN, ma ho incontrato una domanda strutturale/di installazione che la documentazione non sembra spiegare in modo intuitivo come impostare e io sono chiedendo se è anche possibile.Configurazione repository Git per lo sviluppo da due macchine?

La mia configurazione è che ho diversi computer da cui sviluppo (desktop e laptop), quindi, per mantenere più facilmente la sincronizzazione e fornire il backup per il repository git, ho impostato un repository "pubblico" in casa mia Server Linux su cui posso eseguire l'accesso da desktop e laptop. Non è veramente pubblico, dal momento che richiede l'accesso SSH alla scatola per arrivare.

Il mio problema arriva quando faccio modifiche sul mio desktop, posso spingere facilmente le modifiche al repository del server (ho il set mirror bandierina per il origin remoto su quel repository), e l'utilizzo di gitx posso vedere che il locale e gli stati remoti sembrano identici e ciascuno dei miei singoli commit è stato registrato sul server.

La domanda è quando passo al mio laptop, che uso piuttosto raramente, il repository git ci sono probabilmente diversi commit dietro la versione del server e deve essere aggiornato. Ho iniziato a utilizzare git pull per ottenere le modifiche locali, ma piuttosto che duplicare tutti i singoli commit sul server nel repository locale, aggiunge un nuovo commit 'unione' al repository locale e gitx mostra l'unione nel ramo repository remoto in quello punto.

Esiste un comando/flusso di lavoro che consente di aggiornare il repository locale allo stato esatto del repository remoto (in modo tale che se eseguo uno git push --mirror nessun dato andrebbe perso)? Dovrei cancellare il mio repository locale ogni volta e git clone di nuovo ogni volta?

Attualmente nessun altro avrebbe bisogno di accedere a questo repository, anche se in futuro potrebbe diventare un deposito pubblico da cui attingere le persone, quindi le risposte che non distruggono tale possibilità sarebbero apprezzate.

Modifica: I miei commit includono rami di ribasso fuori dal ramo principale; potrebbe essere questo il trigger del comando git pull da mostrare come unione? Il flag --rebase è quello che mi serve allora?

Soluzione Spiegazione: Si scopre che avevo fatto la seguente per impostare i miei repository:

  • utilizzare il laptop per inizializzare un repository git
  • repository push computer portatile al server (impegnarsi A)
  • ha fatto un cambiamento e impegnata sul computer portatile (laptop a commettere B)
  • Desktop repository cloni del server (commit A)
  • apportare modifiche al desktop e commettere (impegna C, D, E, incluse le filiali rebasing)
  • Desktop spinge al server (server in rapido in avanti per E)
  • Quando portatile tira dal server, i risultati in una stampa (dal B non possono digiunare in avanti per E).
  • Il computer portatile si unisce e invia modifiche al server
  • Anche il desktop deve unirsi.

A causa di quell'unico commit extra che è stato un errore newb non intenzionale, mi ha portato a pensare che sarebbe sempre stata un'unione. Su suggerimento di Xentac, sono tornato indietro e ho trovato sul computer portatile che avevo fatto un'unione che non è stata spinta al server, il che era il colpevole, e una volta ho ottenuto tutti e tre i sincronismi realmente sincronizzati, git pull --ff (forzando solo le unioni veloci) funziona perfettamente e mi avvisa se qualcosa non è sincronizzato prima di eseguire l'unione.

risposta

4

Poiché si ha il commit sul ramo principale del laptop che non si trova nel ramo master del server, ogni volta che il server cambia, il laptop non può semplicemente aggiornare il puntatore del ramo master. Ecco perché stai creando commit di unione.

Se si desidera continuare ad avere modifiche che non sono memorizzate sul server ma solo memorizzate sul laptop, sarà necessario git fetch e quindi git rebase origin/master. Il recupero scaricherà i commit dal server ma non cambierà i rami locali e il rebase ricreerà le modifiche del ramo master del laptop in cima al ramo master del server (origine/master).

Probabilmente sarebbe meglio non avere quei comandi che penzolano intorno però. Non possono essere integrati nell'intero codice per avere solo una storia comune?

1

Stavo per suggerire di utilizzare il flag --ff, ma la pagina man dice che è il comportamento predefinito. Potresti provare git pull --ff e vedere se fa la differenza.

Se stai ottenendo un commit di unione, ti suggerirebbe di avere dei commit sul tuo laptop che non sono sul server.

Il laptop è configurato come un mirror del server, come il tuo desktop?

Problemi correlati