2010-02-10 16 views
45

ho creato un repository remoto e posso spingere le modifiche apportate ad esso, ma non può recuperare da esso, ho sempre arrivare alla (piuttosto criptico) messaggio di errore:rifiuto git per andare a prendere in ramo corrente

fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository 
fatal: The remote end hung up unexpectedly 

Cosa significa? Cosa devo fare per abilitare il recupero?

(Si noti che questo repository remoto viene utilizzato solo come repository di backup, quindi dovrebbe essere praticamente una copia esatta del mio repository locale. Non riesco davvero a capire perché posso spingerlo ma non recuperarlo. ..)

mio config assomiglia:

[remote "origin"] 
    url = ssh://blablablah 
    fetch = +refs/*:refs/* 
    mirror = true 
+0

Puoi mostrare la tua configurazione per il repository che stai cercando? –

+0

Mmh, come posso vedere quella configurazione? Ho appena installato quel repository remoto usando 'git remote add name server', forse con l'opzione' --mirror'. –

+0

Oliver, la configurazione è in ".git/config'. In particolare, Charles sta parlando della sezione '[remote ...]', credo. –

risposta

24

quello che stai cercando di fare è di prendere il ramo che stai workin on. Cioè, tu sei sul ramo principale e provi ad aggiornarlo. Non e possibile. È più comune aggiornare i rami remotes/* e quindi inserirli in quelli locali. Quello che vuoi è, forse,

git remote add otherrepo thehost:/the/path.git 

che vi repository di configurazione da recuperare in remotes/otherrepo/*. git fetch otherrepo dovrebbe fare il trucco. Alternativeley, puoi modificare manualmente il tuo .git/config e impostare fetch per il telecomando su qualcosa come refs/heads/*:refs/remotes/otherrepo/*.

+0

Grazie! Non capisco davvero cosa sto facendo, ma seguendo i tuoi consigli ora funziona bene. Immagino che si debba dire esplicitamente dove finiranno i rami remoti nel repository locale; Probabilmente avevo il ramo remoto che si sovrapponeva al mio ramo locale, anche se non sono sicuro che abbia senso. :-) Grazie comunque! –

+1

Più o meno. Il fatto che i refs remoti siano in "refs/remotes" è solo una convenzione, ma in realtà non vuoi essere scaricato direttamente nel tuo "refs/hreads/master". Soprattutto quando il tuo "ref/capo/padrone" viene estratto. –

+0

@ MichaelKrelin-hacker cosa devo scrivere al posto di "thehost" –

1

Ho avuto questo problema quando ho clonato senza pensieri un repository invece di recuperarlo, in modo che entrambi i repository fossero maestri. Se non si è lavorato sul repository remoto, è possibile risolvere le cose con i comandi git di base come segue: (1) eliminare il repository remoto, (2) copiare il repository locale su dove era remoto, (3) eliminare il quello locale, e poi (4) ha istituito il repository locale utilizzando

git init; git fetch $REMOTE_GIT_REPOSITORY_URL 

poi git pull e git push farà le cose giuste. Il vantaggio di evitare git remote, secondo la risposta più efficace e di principio di Michael, è che non è necessario pensare alla semantica dei rami di monitoraggio.

+0

Un clone è un clone.Il "master repo" è puramente una convenzione. La domanda qui riguarda il comportamento di "git fetch remote ref: ref" quando HEAD è impostato su ref. – qneill

35

Nel caso in cui qualcuno lo trovi perché desidera specificamente accedere al ramo corrente, è possibile utilizzare il flag --update-head-ok. Da the docs:

u
--update-head-ok
Per GIT predefinita recuperare rifiuta di aggiornare la testa che corrisponde al ramo corrente. Questo flag disabilita il controllo. Questo è puramente per uso interno per git pull per comunicare con git fetch e a meno che non si stia implementando il proprio Porcelain che non si suppone lo utilizzi.

In alcuni casi, vogliamo implementare i nostri comandi di porcellana, ad esempio automazione e attrezzature.

+1

Perché in questo caso non si vuole aggiornare la testa? Perché non vogliono che tu usi questa bandiera? –

+0

Anch'io sono curioso, perché è giusto che recuperi l'aggiornamento di tutti gli altri rami tranne quello corrente? – cdosborn

+0

Pensavo che la restrizione fosse lì per impedire di perdere lavoro, ma ho verificato che anche con il comando '-u' i commit non-fast forward sono stati respinti: '! [rifiutato] master -> master (non-avanti veloce) ' –

-1

Ho lo stesso problema. Prima provo a recuperare usando questo

git fetch [remote_name] [branch_name] 

Ho avuto lo stesso problema che hai menzionato. Dopo di ciò ho provato questo semplice comando.

git pull [remote_name] [branch_name] 

Nota recupererà e unirà le modifiche. Se si utilizza il terminale allora il file si apre, richiedendo il messaggio di commit. Con questo messaggio si sposterà l'ultimo commit. Prova questo comando e finalmente sarai in grado di inviare la richiesta.

git push [remote_name] [branch_name_local] 
0

Anche questo dovrebbe funzionare se si è in maestro ramo e vuole ottenere ultima provare questa origine tirare

git maestro

0

sono effettivamente digitando Git comandi nella riga di comando o stai eseguendo l'eseguibile Git dal tuo codice?
Se lo stai eseguendo dal codice, sei sicuro che Git stia cercando di recuperare nella directory locale corretta?

Ci sono due possibili modi per farlo:

  1. Utilizzare le opzioni fornite dal linguaggio di programmazione per impostare la directory di lavoro corretto prima di eseguire Git
    (C# example, perché questo è quello che sto utilizzando)

  2. Sempre passare the -C parameter a Git per specificare la directory con il repository locale.


Ho un progetto in cui sto chiamando il Git eseguibile dal codice C#, e ho ottenuto lo stesso messaggio di errore come nella domanda quando ho accidentalmente dimenticato di impostare il -C parameter.

Problemi correlati