2013-01-17 18 views
5

Ecco lo scenario. Ho due macchine, "desktop" e "laptop".Come mantenere sincronizzati due repository git?

Sul tavolo faccio:

mkdir git_test 
cd git_test 
git init 
dd if=/dev/urandom of=test.img bs=1k count=1000 
git add test.img 
git commit -m "Added first image" 

Poi sul computer portatile che faccio:

git clone [USER]@desktop:/home/[USER]/git_test  
cd git_test 
dd if=/dev/urandom of=test2.img bs=1k count=1000 
git add test2.img 
git commit -m "Added second image" 

poi voglio il repo git sul mio desktop a guardare come il repo git sul mio portatile. Sul computer portatile, ho emettere il seguente: git push origin maestro

Ma poi ho capito:

remote: error: refusing to update checked out branch: refs/heads/master 
remote: error: By default, updating the current branch in a non-bare repository 
remote: error: is denied, because it will make the index and work tree inconsistent 
remote: error: with what you pushed, and will require 'git reset --hard' to match 
remote: error: the work tree to HEAD. 
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to 
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into 
remote: error: its current branch; however, this is not recommended unless you 
remote: error: arranged to update its work tree to match what you pushed in some 
remote: error: other way. 
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set 
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'. 

Come faccio a mantenere queste due operazioni pronti contro termine in sincronia?

I messaggi di errore sembrano implicare che git abbia la funzionalità che desidero, ma per qualche motivo sembra essere un flusso di lavoro più avanzato. Ho sentito qualcuno dire una volta che non si può spingere verso la filiale in cui ci si trova attualmente, qualcuno può elaborarla come possibile soluzione? Non avrei alcun problema con una soluzione di questo tipo, cioè potrei lavorare su un certo ramo del mio portatile e un ramo diverso sul mio desktop, e quindi solo sincronizzarli in qualche modo in modo che siano identici.

Si prega di notare quanto segue!

  • Non voglio usare un repo centralizzato, come GitHub, per diversi motivi. Il primo è la sicurezza. Il secondo è la semplicità. Il terzo è che a causa delle circostanze in cui non entrerò qui, non posso contare di avere una connessione internet ad un server remoto, ho solo le mie due macchine collegate via LAN. Infine, voglio imparare come fare le cose nel modo in cui ho richiesto qui, per ottenere quella specifica conoscenza.

  • Inoltre, non voglio utilizzare un repository nudo, in quanto un repository nudo ha un mucchio di cruft nella directory principale. Questo è brutto e disordinato. L'intera ragione per cui mi sono mosso per uscire dalla sovversione è che git sembrava una soluzione molto più pulita e decentralizzata. Inoltre, ho alcune persone un po 'non tecniche che funzioneranno nella directory principale del desktop, saranno confuse dal cruft. La bellezza di git è (pensavo) che tutto si nasconda nelle cartelle .git. Edit: Apparentemente non ero abbastanza chiaro con questo punto. Immagina di avere una cartella "Documenti" con le seguenti sottocartelle: mydata1 e mydata2. Questo non è un esempio forzato, questo è esattamente il problema che sto cercando di affrontare. mydata1 dovrebbe contenere "test.img", e solo quel file, ma invece ha ora:

    rami configurazione descrizione TESTA ganci informazioni oggetti arbitri

volevo essere in grado basta inserire cd in mydata1 e iniziare a modificare i file, ma invece devo provare a effettuare il cd attraverso i rami, o qualsiasi altra cosa anche solo per fare il lavoro. E avere questo tipo di struttura di directory per la sottocartella che si trovava in "documenti" è semplicemente irrealizzabile. Per favore, per favore non dirmi di fare le cose in questo modo. Per favore, rispondi alla domanda. Grazie.

Questi due punti sono per intero motivo per cui sto postando questa domanda qui.Per favore rispondi solo se hai una risposta a questa domanda. :) Grazie!!

+0

il "cruft" a cui mi riferisco è il seguente: "configurazione dei rami descrizione HEAD aggancia gli oggetti info refs" Voglio solo/home/[Utente]/git_repo per contenere solo i file con cui lavoro. Inoltre: le cartelle .git sono nascoste. –

+0

È possibile nascondere il repository. – nobar

risposta

10

Un modo per fare ciò è tirare, non spingere. Dopo aver impostato i tuoi due macchine, sulla prima macchina:

git remote add origin [USER]@laptop:/home/[USER]/git_test 
git pull # Complains about untracked branch while adding the branch you want to track 
git branch --set-upstream master origin/master 
git pull 

Ora si può tirare impegna da entrambe le macchine. Se si voleva spingere, non sono sicuro su come procedere con una configurazione decentralizzata.

+0

pull funziona assolutamente per il mio flusso di lavoro, a patto che non abbia a che fare con un repository o un repository centralizzato. Grazie per questo chiarimento. Verificherò questo flusso di lavoro e riferirò. Grazie! –

+1

Una possibilità per non spingere abbastanza se le macchine sono anche leggermente separate fisicamente: crea un alias bash per qualcosa come "alias git_push =" ssh remotemachine "cd git_test; git pull" "' – cjc343

+0

Questa è sicuramente la strada da percorrere. Considera se i due repository appartengono a te ea qualcun altro; non vorresti che quell'altra persona gettasse le sue cose nel tuo repository e non vorrebbe che tu gettassi le tue nelle tue. Una storia diversa per inserire il nuovo lavoro, forse in un ramo diverso, piuttosto che averlo spinto. –

2

Mi può mancare il motivo per cui non si desidera utilizzare un repository completo, e credo che la soluzione di sola estrazione funzioni correttamente, ma credo anche che il "cruft" possa ancora essere nascosto nel modo desiderato quando si lavora con un repository nudo.

Sul desktop, se:

mkdir git_test 
git init --bare git_test 

E poi:

git clone bare_repo_directory new_location 

Si può spingere e tirare normalmente repo nudo (riferimento come origine di default) dal clone, e nessuno dovrà occuparsi del contenuto extra che contiene; i cloni avranno solo la directory .git.

Per spingere è necessario eseguire:

git push origin master (assuming you're working out of master) 

per il vostro laptop:

git clone [USER]@desktop:path_to_bare 

E il lavoro dovrebbe essere normale nella copia clonata. Spingerai e tirerai dall'origine (che è il repository nudo), ma non dovresti aver bisogno di lavorarci direttamente.

1

Il motivo per cui la spinta non funziona è esattamente ciò che si menziona. Per impostazione predefinita, non è possibile passare a un brach se lo spazio di lavoro corrente di quel repository (il remoto che riceve il push) punta allo stesso ramo. Pertanto, se il tuo dispositivo remoto ha già effettuato il checkout master, non sarà possibile effettuare il push su master.

Due soluzioni rapide:

Se avete già qualsiasi commit nel repository, appena checkout direttamente un hash, che vi metterà in uno stato senza testa, il che significa che non siete in qualsiasi filiale:

> git checkout <any-hash> 
Note: checking out '<any-hash>'. 

You are in 'detached HEAD' state... 

un altro modo con un nuovo pronti contro termine, se si vuole spingere a master, è solo di cambiare quel ramo iniziale a qualcosa d'altro che non si chiami master:

> git symbolic-ref HEAD refs/heads/non-existent 

Questo ti metterà in uno stato simile a quello con master in un nuovo repository, in un ramo senza commit su di esso. Solo tu non starai afferrando il padrone e così sarà permesso ricevere spinte.

1

Recentemente ho riscontrato un problema in cui il mio server e il mio desktop non erano sincronizzati. Dopo aver cercato per un po 'sul web non sono riuscito a trovare una risposta che riguardasse la mia situazione esatta. Così ho chiamato il supporto Rackspace e sono stati in grado di fornirmi quella che penso sia una risposta migliore di quella che sono riuscito a trovare online.

Questo thread è stato il più vicino al mio problema, quindi ho pensato di condividere come ho risolto il problema qui nel caso in cui qualcuno incontri lo stesso problema in futuro.

Ecco cosa è andato storto

stavo cercando di installare il plugin Sweet Tooth per Magento e seguito insieme con i soliti passaggi che tutti noi passare attraverso per installare le estensioni Magento. Questo significa prendere un sacco di file e inserirli nelle directory App, JS e Skin.

Nella directory app/design/adminhtml è presente una cartella "base". Se sai qualcosa su Magento, sai che hanno un avvertimento di zillion su come scherzare con i file di base. In breve - non farlo.

Supponevo che dal momento che il mio repository locale non avesse la directory "base" sarei a-ok a metterlo sul mio computer locale. Sfortunatamente e con mio grande sgomento, ciò significa che quando ho fatto il mio aggiungere, ho aggiunto una directory "base" con solo i file di Sweet Tooth. Quando poi l'ho messo sul server, ha cancellato la mia intera directory di base e Boom! giù andò Magento.

Per fortuna sono riuscito a tornare allo stato precedente server utilizzando il seguente comando salva-vita:

git ripristinare --hard HEAD @ {1}

Questo comando prende ritorna al commit precedente e immediatamente tutto è tornato alla normalità. Ovviamente ora il mio server e il mio desktop erano fuori sincrono da quando il mio server era ora un commit dietro.

Per aggiungere la beffa al danno ho fatto un errore molto stupido e ho cancellato i file per l'estensione dal mio computer e ho fatto un altro commit sul mio desktop così ora il server e il desktop non erano sincronizzati da due commit e git ora li ha file nella sua cache.

Ecco come ho risolto

Ovviamente questo ti lascia in un posto abbastanza fastidioso perché facendo un pull git sul mio server spazzerà-out il mio indice "base" ogni singola volta. Inoltre, poiché sono due i commit successivi, non posso semplicemente eseguire il rollback di un commit.

Ho chiamato Rackspace che a questo punto sono divinità nella mia mente e ho trovato due modi diversi per risolvere questo a seconda che si desideri farlo dal lato server o dal desktop.

A quanto risulta, non è possibile farlo dal lato server poiché i file non sono più sul desktop. Mentre loro consigliavano di fare un commit git -a e poi fare una push dal server seguito da un pull dal desktop, questo non funzionerebbe, i file non sono più sul desktop.

Quindi devi ripararlo dal desktop ed è necessario estrarre quei file dannati dalla cache.

fissaggio Sync questione dal desktop

Per ottenere i file di cache che ha emesso il seguente comando sopra, e più volte, e più volte fino a quando i file che avevo rimosso sono stati rimossi in base alla git .

git rm -r --cached/cartella/directory per le directory

e

git rm --cached/cartelle/file per i file

Ora che questo era fuori dalla cache, ero in grado di fare un commit e finalmente far sapere a git che questi file erano spariti.

Questo è stato seguito da una spinta al master. Quindi tutto ciò che restava da fare era una spinta dal server e dalla viola, di nuovo in affari!

** Conclusione e le lezioni apprese **

Le lezioni apprese qui sono stati alcuni quelli più grandi e sto scrivendo questo post per altri programmatori che hanno un problema simile come me per ricordarmi di cosa non fare mai più.

  1. Se non si dispone di una cartella nel vostro repo locale che si trova sul server, non aggiungere al vostro repo locale con solo alcuni file in essa contenuti, questo azzererà-out la directory su il server.

  2. Se vite per caso le cose, assicurarsi di rimuovere i file con git, non li elimina dal vostro filesystem locale

  3. git riposare --hard HEAD @ {1} può essere il vostro migliore amico a volte

Spero che questo aiuti chiunque altro che si trova in una situazione simile. Ho passato ore a riversare documenti online ma non ho trovato nulla con le complessità in cui mi sono imbattuto, quindi se posso aiutare qualcun altro a risparmiare un po 'di tempo e ottenere un po' di capelli grigi, il mio incubo sarà servito a qualcosa di buono per il mondo !

Problemi correlati