2010-10-23 15 views
6

Avere un repository Git remoto su cui ho spinto un ramo da una macchina e tirato su un'altra macchina.Errore "receive.denyCurrentBranch" quando si preme per annullare il repository Git

Apportate alcune modifiche all'altra macchina, cercando di trasferire tali modifiche indietro al repository remoto, e ottengo l'errore 'receive.denyCurrentBranch'.

Cosa sta succedendo?

Questo non dovrebbe accadere in un repository nudo - non c'è nulla di verificato su di esso.

I rami come si vede dalla macchina 2 sono:

Fix 
dev1 
dev2 
remotes/origin/HEAD -> origin/dev1 
remotes/origin/Fix 
remotes/origin/dev1 
remotes/origin/dev2 
remotes/origin/master 

'Fix' è il ramo corrente su entrambe le macchine dev.

Quando ho tirato in origine quel ramo sulla macchina 2, ho fatto:

git pull 
git checkout -b Fix origin/Fix 

io sono sospettoso della prima linea 'telecomandi' - sembra che la testa deve essere rivolta al mio ramo corrente, ma non lo è. Pensa che mi manca qualcosa, qui ..

Update 1 ho fuso il ramo 'Fix' giù al ramo dev1, e quindi pushd il ramo 'dev1' - che ha funzionato bene (stavo per fare quello, comunque).

Quindi, questa era una soluzione, ma penso che il vero problema era che l'HEAD non era legato al ramo corrente ('Fix'), ma a un ramo inattivo ('dev1'). Non sono sicuro di come cambiare la testa sul repository remoto?

+0

Qualcuno per favore mi corregga se sbaglio, ma nude repository non dovrebbero avere anche * * una testa.Ciò indicherebbe che esiste una directory di lavoro, e HEAD punta al commit su cui si basa ... Sei sicuro che il repository remoto sia scarno? – Jonathan

+0

Piuttosto sicuro. Non esiste un progetto estratto e tutti i file 'git' si trovano nella directory di livello superiore del repository. – rickb

+0

Jonathan, un semplice repository Git ha un HEAD, ma nessun workspace predefinito. Uno spazio di lavoro può ancora esistere per un repository nudo, ma devi informare Git dove esiste usando la variabile di ambiente 'GIT_WORK_TREE' o l'opzione Git' --work-tree' e la posizione del repository usando la variabile di ambiente 'GIT_DIR' o l'opzione' - -git-dir'. –

risposta

1

dalla macchina 2, caricare arbitri dal repository locale al repository remoto è possibile utilizzare arbitri espliciti nel comando push:

git push origin Fix:refs/heads/Fix 

Dopo di che, nella macchina 1, è necessario utilizzare il comando recupero su ottenere gli arbitri remoti

git fetch 

nell'elenco dei rami (ramo git -a), si trovano origine/Fix (o telecomandi/origine/Fix), è possibile il browser il contenuto del ramo a distanza direttamente utilizzando il comando checkout:

git checkout origin/Fix 

Effettuare le modifiche, si impegnano, ecc ... e poi spingerlo con lo stesso comando utilizzato in macchina 2:

git push origin Fix:refs/heads/Fix 

per tenere traccia del ramo (questo è, di creare una filiale locale che "punti" del ramo remoto, utilizzare il comando di checkout con --track opzionale):

git checkout --track -b Fix origin/Fix 

Poi, si può lavorare sulla locale filiale Fix e non spingere e tirare senza altri argomenti

git pull 
git commit 
git push