2010-08-01 15 views
93

Ho creato un repository nudo per pubblicare il mio repository, ma non riesco a capire come aggiornare il repository nudo con lo stato corrente del repository principale.Come posso aggiornare il mio repository bare?

+2

Vedere questa risposta: http://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/2964397#2964397 –

risposta

57

Se si desidera duplicare tutti gli oggetti dalla repo principale, fare questo all'interno della repository principale:

git push --all <url-of-bare-repo> 

In alternativa, effettuare un'operazione di recupero all'interno del pronti contro termine a nudo:

git fetch <url-of-main-repo> 

Non è possibile fare un pull, perché un pull vuole unire con HEAD, che un repository nudo non ha.

È possibile aggiungere questi come telecomandi per risparmiare un po 'di battitura nel futuro:

git remote add <whatever-name> <url-of-other-repo> 

allora si può semplicemente fare

git push --all <whatever-name> 

o

git fetch <whatever-name> 

a seconda di ciò repo sei in. Se <whatever-name> è origin, puoi anche lasciarlo fuori r.

Disclaimer: Io non sono un git guru. Se ho detto qualcosa di sbagliato, mi piacerebbe essere illuminato!

Aggiornamento: Leggi i commenti!

+0

Il push sembra funzionare bene, grazie per il suggerimento penso che sarà in grado di integrarlo in un gancio o qualcosa di simile. –

+4

Quando ho fatto un 'git-fetch --all' all'interno del repository nudo, non ho visto gli aggiornamenti che avevo fatto al repository principale, ma quando li spingevo dal repository principale con' git push --all 'Vedo gli aggiornamenti in' git log'. Presumibilmente c'è una spiegazione semplice per questo - qualcuno può spiegare? – pho79

+0

Cosa intendi con "non visto"? Non sono sicuro di come 'git log' si comporta in un repository nudo; forse prova 'git log --all'? – Thomas

3

Aggiungere il repository nudo come repository remoto, quindi utilizzare git push.

+0

Quindi, se voglio farlo senza spingere non posso utilizzare un repository nudo e utilizzare un collegamento simbolico o qualcosa del genere? –

+0

Il push è il metodo normale per trasferire i contenuti del repository su un repository nudo, non è necessario evitarlo. – Philipp

+0

Non si può sempre spingere. Ad esempio, se il bare è in una rete privata e il repository principale è pubblico (su GitHub, ad esempio) – fanf42

53

ho creato un repository utilizzando il seguente comando

git clone --bare <remote_repo>

Poi ho provato ad aggiornare il clone nuda con la risposta di Thomas, ma non ha funzionato per me. Per ottenere il repository nuda per l'aggiornamento (che è quello che penso Let_Me_Be stava chiedendo), ho dovuto creare un repository specchio:

git clone --mirror <remote_repo> 

Poi ho potuto eseguire il seguente comando nel repository a specchio per afferrare gli aggiornamenti del repository principale :

git fetch --all 

mi sono imbattuto in questa soluzione con la lettura Mirror a Git Repository By Pulling

+11

Per modificare un repository bare esistente in mirroring, è sufficiente aggiungere 2 righe al file git config al numero .git/config. Nella sezione '' [remote "origine"] ', aggiungi' fetch = + refs/*: refs/* 'e' mirror = true' –

31

L'unica soluzione oltre a ricreare con git clone --mirror è from Gregor:

git config remote.origin.fetch 'refs/heads/*:refs/heads/*' 

quindi puoi git fetch e vedrai gli aggiornamenti. La cosa strana è che prima di questo, anche se c'è un remote configurato, non ha filiali elencate in git branch -a.

+1

Questo mi ha davvero aiutato! Anche Capistrano project/repo utilizza questa impostazione per consentire a 'liner update update git 'di eseguire il lavoro. –

+0

Se il telecomando ha rami di aggiornamento o eliminazione forzati (e si desidera riflettere tali modifiche), potrebbe essere necessario aggiungere '--force' e' --prune' rispettivamente alla riga 'git fetch'. –

4

Dopo tanto scherzo ho scoperto che questo funziona per me.

volta:

git clone --mirror ssh://[email protected]:2000/repo 
git remote add remote_site ssh://[email protected]_site.address/repo 
git config remote.origin.fetch 'refs/heads/*:refs/heads/*' 

ogni volta che voglio sincronizzare:

cd /home/myhome/repo.git 
git --bare fetch ssh://[email protected]:2000/repo 
git fetch ssh://[email protected]:2000/repo 
git push --mirror remote_site 
+1

La terza riga ('git config remote.origin.fetch 'refs/heads/*: refs/heads/*'') è la chiave. Buona risposta, grazie! – peterh

26

Assumendo:

$ git clone --bare https://github.com/.../foo.git 

Fetch con:

$ git --git-dir=foo.git fetch origin +refs/heads/*:refs/heads/* --prune 

Nota: --git-dir=foo.git non è necessario se si prima nella directory.

+2

Strano che questa risposta non sia in cima. Almeno funziona qui ... –

+0

Ho fatto un clone nudo, e non c'è origine ... – Kieveli

+2

Anche se non sono a conoscenza quando ciò accade, se 'origine' non è definita, puoi sempre sostituire' origine' parte con il percorso/url del tuo repository originale. per esempio. '$ git --git-dir = foo.git recupera https://github.com/.../foo.git + refs/heads/*: refs/heads/*' – antak

Problemi correlati