Domanda

Come posso impostare il riferimento HEAD di un Git remoto in modo che punti a qualcosa oltre a "master"?

Il mio progetto ha una politica di non utilizzare un ramo "master" (tutti i rami devono avere nomi significativi).Inoltre, il repository principale canonico è accessibile solo tramite ssh://, senza accesso alla shell (come GitHub o Unfuddle).

Il mio problema è che il repository remoto ha ancora un riferimento HEAD a refs/heads/master, ma ho bisogno che punti a un ramo diverso.Ciò sta causando due problemi:

  1. Quando si clona il repository, ecco questo,

    avvertimento:L'HEAD remoto si riferisce a un riferimento inesistente, impossibile effettuare il checkout.

    Questo è confuso e scomodo.

  2. Il browser del codice basato sul web dipende da HEAD come base per la navigazione nell'albero.Allora ho bisogno che HEAD punti a un ramo valido.

È stato utile?

Soluzione

C'era quasi il stessa domanda su GitHub un anno fa.

L'idea era di rinominare il ramo master:

git branch -m master development
git branch -m published master
git push -f origin master 

Fare in modo che il master abbia ciò che vuoi che le persone usino e svolga tutto il resto del lavoro nelle filiali.

(UN "git-symbolic-ref HEAD refs/head/published" non verrebbe propagato al repository remoto)

Questo è simile a "Come posso eliminare origin/master in Git".


Come detto in questo filo:(sottolineatura mia)

"git clone" crea solo un unico ramo locale.
Per fare ciò, guarda il HEAD ref del repository remoto e crea un ramo locale con lo stesso nome del ramo remoto a cui fa riferimento.

Quindi, per concludere, hai il repository A e clonalo:

  • HEAD Riferimenti refs/heads/master e questo esiste
    -> ottieni un ramo locale chiamato master, a partire da origin/master

  • Riferimenti HEAD refs/heads/anotherBranch e questo esiste
    -> ricevi una chiamata da una filiale locale anotherBranch, a partire da origin/anotherBranch

  • Riferimenti HEAD refs/heads/master e questo non esiste
    -> "git clone" si lamenta

Non sono sicuro che esista un modo per modificare direttamente il file HEAD ref in un repository.

(che è il punto centrale della tua domanda, lo so;))


Forse l'unico modo sarebbe a "pubblicazione per i poveri", dove tu:

 $ git-symbolic-ref HEAD refs/head/published
 $ git-update-server-info
 $ rsync -az .git/* server:/local_path_to/git/myRepo.git/

Ma ciò comporterebbe l'accesso in scrittura al server, cosa che non è sempre possibile.


Come spiego in "Idiota:Modo corretto per modificare Active Branch in un repository nudo?", git remote set-head non cambierebbe nulla sul repository remoto.

Cambierebbe solo il ramo di monitoraggio remoto archiviato localmente nel repository locale, in remotes/<name>/HEAD.

Altri suggerimenti

Aggiornamento: Funziona solo per la copia locale del repository (il "cliente"). Si prega di vedere i commenti degli altri sotto.

Con una versione recente di Git (febbraio 2014), la procedura corretta sarebbe:

git remote set-head $REMOTE_NAME $BRANCH

Così, per esempio, il passaggio della testa di origin telecomando per ramo develop sarebbe:

git remote set-head origin develop

Dal momento che si parla GitHub, di farlo sul proprio sito basta andare nel vostro progetto, allora ...

admin > Default Branch > (choose something)

Fatto.

Si veda: http: // www .kernel.org / pub / software / scm / git / docs / git-simbolico-ref.html

Questa imposta il ramo di default nel repository git. È possibile eseguire questo nei repository nudi o specchio.

Utilizzo:

$ git symbolic-ref HEAD refs/heads/<branch name>

(C'era già fondamentalmente la stessa domanda " creare un git simbolica ref in repository remoto", che ha ricevuto una risposta universale.)

Ma ci sono risposte specifiche per vari Git "fattorie" (in cui più utenti possono gestire repo Git attraverso un'interfaccia limitata: via http e ssh): http://Github.com , http://Gitorious.org , http://repo.or.cz , Girar ( http://git.altlinux.org ).

Queste risposte specifiche potrebbero essere utili per coloro che leggono questa pagina e pensare a questi servizi specifici.

Se si ha accesso al repository remoto da una conchiglia, basta andare nella .git (o la directory principale se la sua una nuda pronti contro termine) e modificare il file HEAD per puntare alla testa corretta. Ad esempio, per impostazione predefinita contiene sempre 'refs: refs / testa / master', ma se avete bisogno foo di essere il capo, invece, basta modificare il file HEAD e modificare il contenuto di 'refs: refs / teste / foo' <. / p>

È possibile creare un indipendente Master ramo utilizzando solo porcellana comandi Git:

git init
touch GO_AWAY
git add GO_AWAY
git commit -m "GO AWAY - this branch is detached from reality"

Questo ci dà un Master ramo con un messaggio maleducato (si consiglia di essere più gentile). Ora creiamo la nostra filiale di "reale" (chiamiamolo tronco in onore di SVN) e il divorzio da Master :

git checkout -b trunk
git rm GO_AWAY
git commit --amend --allow-empty -m "initial commit on detached trunk"

Ehi, presto! gitk --all mostrerà Master e tronco senza alcun legame tra di loro.

La "magia" è che - modificare cause git commit per creare un nuovo commit con lo stesso genitore come l'attuale capo, poi fare il punto HEAD ad esso . Ma l'attuale capo non ha un genitore in quanto è il primo commit nel repository, in modo che il nuovo capo non ottiene uno o, rendendoli staccati gli uni dagli altri.

Il vecchio HEAD commit non vengono eliminati da git-gc perché refs / teste / master punta ancora ad esso.

Il - allow-vuoto la bandiera è necessaria solo perché stiamo commettendo un albero vuoto. Se ci fosse un git add s 'dopo il git rm , allora non sarebbe necessario.

In realtà, è possibile creare un ramo staccato in qualsiasi momento ramificazione iniziale commit nel repository, cancellando il suo albero, aggiungendo il vostro albero indipendente, quindi fare git commit --amend .

So che questo non risponde alla domanda di come modificare il ramo default sul repository remoto, ma dà una risposta pulita su come creare un ramo indipendente.

In primo luogo, creare il nuovo ramo che si desidera impostare come predefinito, ad esempio:

$>git branch main

Avanti, premere quel ramo al origine :

$>git push origin main

Ora, quando si effettua il login al vostro account GitHub, si può andare al proprio repository e scegliere Impostazioni> Filiale di default e scegliere " principale ."

Quindi, se lo desiderano, è possibile eliminare il branch master:

$>git push origin :master

Per le persone gitolite, gitolite supporta un comando chiamato - attendere che - symbolic-ref. Esso consente di eseguire quel comando in remoto, se si ha il permesso W (scrittura) per il pronti contro termine.

In relazione alla domanda, ho finito qui durante la ricerca di:

Come faccio a fare un repo locale a conoscenza di un ramo di default cambiato su GitHub

Per completezza, aggiungendo la risposta:

git remote set-head origin -a

Semplice basta accedere al tuo conto GitHub e sul lato destro nel menu di navigazione scegliere Impostazioni , in Scheda Impostazioni scegliere Predefinito Branch e tornare alla pagina principale del tuo repository che ha fatto il trucco per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top