Come aggiorno il mio repository nudo?


Risposte:


83

Se si desidera duplicare tutti gli oggetti dal repository principale, farlo all'interno del repository principale:

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

In alternativa, esegui un recupero all'interno del repository nudo:

git fetch <url-of-main-repo>

Non è possibile eseguire un pull, perché un pull vuole fondersi con HEADun repository nudo.

Puoi aggiungerli come telecomandi per risparmiare un po 'di battitura in futuro:

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

Quindi puoi semplicemente farlo

git push --all <whatever-name>

o

git fetch <whatever-name>

a seconda del repository in cui ti trovi. Se lo <whatever-name>è origin, puoi anche lasciarlo fuori del tutto.

Disclaimer: non sono un git guru. Se avessi detto qualcosa di sbagliato, mi sarebbe piaciuto essere illuminato!

Aggiornamento: leggi i commenti!


7
Quando ho fatto un git-fetch --allrepository interno, non ho visto gli aggiornamenti che avevo fatto al repository principale, ma quando li git push --all <url-of-bare-repo>ho spinti dal repository principale con vedo gli aggiornamenti git log. Presumibilmente c'è una semplice spiegazione per questo - qualcuno può spiegare?
pho79,

2
@Thomas - Sì, per "non ho visto" Voglio dire git log, non mostra questi aggiornamenti nel repository nudo. (Né lo è git log --all, e nemmeno un repository funzionante creato creando una clonazione del repository nudo - tramite git log --allo semplicemente guardando nuovi file che dovrebbero essere visualizzati lì). È un test abbastanza veloce da vedere da soli. Principalmente sono solo curioso di sapere cosa mi sto perdendo.
pho79,

71
Se il tuo repository più remoto è qualcosa come github, a cui non hai accesso, non puoi eseguire push, ecc., Puoi farlo git fetch -q origin master:masterall'interno del tuo repository nudo locale. Questo recupererà le nuove cose dal ramo principale di Github e aggiornerà il tuo ramo principale locale ad esso.
Altreus,

4
@Altreus Infatti master:masterè ciò che è necessario per spostare HEAD in avanti a quello del repository remoto. Nel mio caso a causa di un problema non potevo più collegarmi al nostro repository nudo perché mancava git. Fino a quando non viene risolto, faccio un tunnel inverso e vado al repository centrale usando: git fetch ssh://localhost:8765/... master:mastere funziona come un incantesimo. Grazie!
estani,

3
@Altreus Se vuoi tutti i rami, allora puoi farlogit fetch origin *:*
JBert

71

Ho creato un repository utilizzando il seguente comando

git clone --bare <remote_repo>

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

git clone --mirror <remote_repo>

Quindi ho potuto eseguire il comando seguente nel repository con mirroring per afferrare gli aggiornamenti del repository principale:

git fetch --all

Mi sono imbattuto in questa soluzione leggendo Mirror a Git Repository Pulling


22
Per cambiare un repository nudo esistente in mirror, tutto ciò che devi fare è aggiungere 2 righe al file git config in <REPO> .git / config. Nella [remote "origin"]sezione, aggiungi fetch = +refs/*:refs/*emirror = true
Isaac Betesh il

@IsaacBetesh Mi hai salvato la giornata :)
smc

54

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

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

allora puoi git fetche vedrai gli aggiornamenti. La cosa strana è che prima di questo, anche se c'è un remoteconfigurato, non ha rami elencati in git branch -a.


1
Questo mi ha davvero aiutato! Il progetto / repository Capistrano utilizza anche questa impostazione per consentire a una linea git remote updatedi eseguire il lavoro.
Minqi Pan

1
Se il telecomando ha rami forzati o eliminati (e si desidera riflettere tali modifiche), potrebbe essere necessario aggiungere --forcee --prunerispettivamente alla git fetchlinea.
Elliott Slaughter,

46

assumendo:

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

Scarica con:

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

Nota: --git-dir=foo.gitnon è necessario se si cdaccede prima alla directory.


2
Anche se non so quando ciò si verifica, se originnon è definito, puoi sempre sostituire la originparte con il percorso / url al tuo repository originale. ad esempio$ git --git-dir=foo.git fetch https://github.com/.../foo.git +refs/heads/*:refs/heads/*
antak

Questo e 'esattamente quello che stavo cercando. Questo ha funzionato perfettamente.
Maxime Rouiller il

13

Dopo molti scherzi ho scoperto che questo funziona per me.

Una volta:

git clone --mirror ssh://git@source.address:2000/repo
git remote add remote_site ssh://git@remote_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://git@source.address:2000/repo
git  fetch ssh://git@source.address:2000/repo
git push --mirror remote_site

7
La terza riga ( git config remote.origin.fetch 'refs/heads/*:refs/heads/*') è la chiave. Buona risposta, grazie!
Peter - Ripristina Monica il

2
Come diceva @peterh, la linea git config remote.origin.fetch 'refs/heads/*:refs/heads/*'è la risposta. Dopo aver premuto questo comando, posso solo git fetche il repository si sincronizza con quello remoto.
Joker,

3

Aggiungi il repository nudo come repository remoto, quindi usa git push.


Quindi, se voglio farlo senza spingere, non posso usare un repository nudo e usare un collegamento simbolico o qualcosa del genere?
Šimon Tóth

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

2
Non puoi sempre spingere. Ad esempio, se il nudo è in una rete privata e il repository principale è pubblico (su GitHub, per esempio)
fanf42

0

Per me questa combinazione ha funzionato:

git remote add remote_site https://github.com/project/repo.git
git fetch -u remote_site +refs/heads/:refs/heads/*
git push --mirror

-u era necessario il parametro per il recupero, altrimenti viene visualizzato il messaggio di errore: "Rifiuto di recuperare nel refs / head / master del repository non bare corrente" (vedere anche https://stackoverflow.com/a/19205680/4807875 )

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.