2010-07-21 13 views
161

Ho un repository spoglio utilizzato come archivio centrale per il mio progetto. Tutti gli sviluppatori fanno git clone <repo> da condividere con esso. Quando fanno il clone, ottengono un checkout del ramo principale (a meno che non lo facciano git clone -n) perché repo.git/HEAD contiene ref: refs/heads/master, rendendo questo il ramo attivo .Git: modo corretto per cambiare ramo attivo in un repository nudo?

La domanda è: come modificare correttamente il ramo attivo ? Potrei semplicemente hackerare direttamente il file repo.git/HEAD, ma sembra brutto e, beh, hacky.

Ho provato a fare git checkout <otherbranch> nella directory repo .git, ma non è riuscito perché non ero in un albero di lavoro.

ho provato git update-ref HEAD refs/heads/otherbranch ma che ha appena aggiornato refs/teste/master di essere lo stesso di refs/teste/otherbranch (ok, ho fatto uno in un repository fittizio, non la mia una produzione!)

ho provato git update-ref --no-deref HEAD refs/heads/otherbranch e quasi ha funzionato. Ha aggiornato il file HEAD, ma lo ha impostato sullo SHA1 del commit indicato da refs/heads/otherbranch.

Sto testando con git versione 1.7.0.2.msysgit.0.

Sto indovinando non c'è modo di farlo attraverso git push, a permettere tutti quanti di cambiare il vostro ramo di default sembra un po 'pericoloso (!), Ma sicuramente c'è un modo migliore per farlo nel repository .git directory di direttamente l'hacking del file HEAD.

+0

IMO stai semplicemente cercando di fare The Wrong Thing qui. Se vuoi che il ramo predefinito sia qualcosa di diverso da master, allora quel ramo deve essere il master. In alternativa, utilizzare due diversi repository. –

+10

In che modo questo fondamentalmente sta cercando di fare la cosa sbagliata qui? Un repository nudo supporta più rami. Io uso un repository nudo come back-up nel mio repository locale, e come tale rispecchiano i rami. Ho un master su entrambi e un ramo di sviluppo su entrambi. Se voglio vedere il log del ramo di sviluppo sul repository nudo, devo hackerare i file - sembra che git sia fondamentalmente sbagliato qui riguardo al supporto del repository nudo. – Cthutu

+11

@NicholasKnight IMHO sei fondamentalmente sbagliato qui. Non c'è niente di speciale in "master" come nome di un ramo, è solo un default. Nei repository che mantengono non abbiamo un ramo master, in quanto "master" non è significativo per l'azienda. Ogni volta che facciamo un rilascio, creiamo un nuovo ramo di manutenzione con il nuovo numero di versione e lo assegniamo come ramo attivo. – Spacemoose

risposta

235

Se si ha accesso al repository remota nuda, questo article suggests:

git symbolic-ref HEAD refs/heads/mybranch 

che aggiornerà il file HEAD nel repository in modo che contenga:

ref: refs/heads/mybranch 

come documentato nel git-symbolic-ref


Se non si ha accesso al repository remoto, vedere my previous answer.


ricordare che un comando come git remote set-head:

  • non cambia il ramo di default del telecomando repo .
    Cambia solo un ramo monitoraggio remoto memorizzato nel vostro locale repo come refs/remotes/<name>/HEAD

  • non cambia per sé HEAD (di nuovo, solo refs/remotes/<name>/HEAD), da qui la necessità di git symbolic-ref.

Così git remote set-headnon è la risposta qui.
git symbolic-ref HEAD è, se si ha accesso diretto al repository remoto.

+3

Grazie! Ho accesso diretto al repository remoto, quindi git-symbolic-ref farà il suo lavoro. Mi piace il trucco senza antenati menzionato sull'altro thread, però - sicuramente uno per il cassetto in basso. Ho passato anni a cercare su Google questo, ma non sono riuscito a trovare la tua risposta precedente, tuttavia "git remote head master" lo trova come il secondo hit più alto, appena sotto git-remote (1). Bizzarro. Basta mostrare quanto è difficile trovare qualcosa quando non sai esattamente quello che stai cercando. – kbro

+0

'git symbolic-ref HEAD refs/heads/mybranch' ha funzionato bene per me! GRAZIE! ;) – vinzenzweber

+1

Apprezzo molto questa domanda, perché ho accidentalmente controllato un ramo * diverso * rispetto al master e ora ho dovuto risolverlo. –

-4

ho confrontato due directory, prima e dopo l'applicazione

git symbolic-ref HEAD refs/heads/mybranch

e sembra che solo il file repo.git/HEAD è stato modificato in modo probabilmente è abbastanza sicuro solo per "hack" il file.

+2

Ci sono sottili problemi di interruzione che possono essere introdotti modificando direttamente i file ref Git. Consiglio vivamente di non farlo. I comandi idraulici sono più facili e più sicuri di modificare direttamente i ref. –

+2

Qual è il vantaggio di questo @boryn? –

+2

Git tiene traccia di molte cose sullo sfondo come una cronologia di ref. Se si modifica manualmente il file, non verrà registrato. È vero che probabilmente non avrà importanza. Ma se perdi traccia di alcuni commit e vuoi trovarli, sarai più felice se non stessi "hackerando" il file. – qwerty9967

0

Inoltre, se non si ha accesso al repository nudi, facendo un git remote set-head e si è fatto

Vedere questo precedente response

-3

Ho anche un repo nuda sul nostro server ed era in grado per recuperare con successo i file utilizzando

git clone //server/repo/directory -b branch_name 

in un nuovo repository locale, anche se la pagina di manuale dice che questo è solo per i repository non-nude.

+1

Mentre quello che dici è vero, il fatto che tu stia usando -b per selezionare un particolare ramo interrompe la tua risposta nel contesto della mia domanda, che è come impostare il ramo DEFAULT. – kbro

0

Per modificare il ramo è necessario modificare il riferimento HEAD al ramo che si desidera utilizzare.

primo elenco tutti i riferimenti nel repository nudo di fare

$find ref 

Quindi trovare il riferimento per il vostro settore, il formato saranno i seguenti refs/heads/<my_branch>. Così passo successivo è quello di verificare di riferimento corrente, basta digitare:

$git symbolic-ref HEAD 

in modo da sapere che è il ramo corrente quindi aggiornare in base alle esigenze.

$git sumbolic-ref HEAD ref/heads/<my_branch> 

Grazie di cuore. Godere.

Problemi correlati