2012-11-19 17 views
6

Ho un repository git con una storia lunga e strana. Non so cosa abbiano fatto gli sviluppatori con questo repository e non possiamo controllare quello che stanno facendo ora.Git clone --bare/fetch

Ma ho bisogno di clonare questo repository (per l'integrazione redmine) e recuperare periodicamente tutte le modifiche.

Cosa faccio:

git clone --bare [email protected]:/opt/git/repo 
cd repo.git 
git log 

Ora posso vedere tutti i commit. Belle.

Avanti uno sviluppatore fare un commit nel repository principale e voglio prendere tutte le modifiche (tutti brances, tag e così via, e così via):

> git fetch --all 
Fetching origin 
remote: Counting objects: 18, done. 
remote: Compressing objects: 100% (14/14), done. 
remote: Total 14 (delta 5), reused 0 (delta 0) 
Unpacking objects: 100% (14/14), done. 
From git.gmcs.ru:/opt/git/ecco 
* branch   HEAD  -> FETCH_HEAD 

Ma se una chiedere al commit storia I non ho visto quell'ultimo commit che è stato fatto nel repository principale. Perché ?

Se inserisco informazioni insufficienti, sono pronto a darti tutto il necessario.

Grazie in anticipo.

Aggiornato

Ecco informazioni Brach nel repsitory originale:

git branch -a 
    one 
    test 
* master 
    release 

Ecco un'informazione ramo nel repository clonato:

git branch -a 
    one 
    test 
* master 
    release 

posso vedere ultimi impegna nel ramo principale del repository originale, ma non è possibile trovarli nel ramo principale del repository clonato.

+0

'fatale:/usr/lib/git/git-pull' non può essere utilizzato senza un albero di lavoro. Penso che sia perché è un repository nudo. – demas

risposta

7

Si dovrebbe usare git pull

o correre git merge dopo recuperare per ottenere cambiamenti recuperati

se si dispone di un repository nudo non si può fare un tiro, perché un pull vuole fondersi con testa, che una nuda il repo non ha.

per aggiornare il repository nudo è possibile aggiungerlo come remote a repository non bare e passare ad esso.

Ma penso che --mirror anziché --bare funzionerà per voi così com'è.

Rispetto --bare, --mirror non solo atlanti sezioni locali della sorgente di sezioni locali del bersaglio, che mappa tutti arbitri (compresi filiali remote, note ecc) e imposta un refspec configurazione tale che tutti questi riferimenti sono sovrascritti da un aggiornamento remoto git nel repository di destinazione .

e quindi è possibile utilizzare per aggiornare git remote update repository speculare

+1

'fatale:/usr/lib/git/git-pull' non può essere usato senza un albero di lavoro. Penso che sia perché è un repository nudo. – demas

+0

Mi dispiace, potrebbe essere, hai bisogno di avere repository nudo? – Cynede

+0

Sì, come vedo il Redmine richiede un repository nudo. Inoltre, questo metodo funziona bene con tutti gli altri repository, bit non riesco a capire cosa c'è di sbagliato in questo repository. – demas

0

È possibile aggiornare il HEAD del repository nudo con git symbolic-ref, per esempioper puntare a ramificarsi master da remoto origin

$ git symbolic-ref HEAD refs/remotes/origin/master 

Se si utilizza git fetch aggiornare telecomandi verrà aggiornato esempio origin/master. Tutto ciò che mancava era il repoint del clone HEAD.

+0

L'ho provato, ma ho ottenuto: 'git log' ->' fatal: bad default revision 'HEAD''. – demas

9

per recuperare ulteriori aggiornamenti in un repo nuda, lo faccio:

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

Allora posso fare:

git fetch 
+2

Questa è la migliore risposta. Tutte le altre risposte al problema del recupero * in * un repository creato da 'git clone --bare' non lo risolvono per me. La soluzione simbolica-ref non è grande perché è necessario farlo ogni volta per ogni ramo, non è desiderabile. –

+1

Se si utilizza 'git fetch -p', si eliminano anche i rami che sono stati rimossi dall'origine. – cdyson37

0

per andare a prendere nel repository nudo regolarmente configurare prima

git config remote.origin.fetch "+*:*" 

e quindi esegui semplicemente

git fetch --prune 

per il recupero di tutte le modifiche, compresi tag, nuove filiali e cancellazioni di rami pari (opzione --prune).

  • prega presente anche la racchiudono virgolette doppie (") nel comando precedente per proteggere l'asterisco (*) non può essere interpretato dalla shell.
  • Il segno più è necessario per consentire aggiornamenti non rapidi. Questa è probabilmente la tua intenzione se vuoi fare il backup dello stato attuale del tuo telecomando.
  • Nota: le eliminazioni dei tag non vengono recuperate utilizzando questa configurazione.

Vedere anche https://stackoverflow.com/a/33461528/4138912.