Cambia un HEAD remoto Git per indicare qualcosa oltre al master

Come faccio a impostare un riferimento HEAD di Git remote in modo che punti a qualcosa oltre a “master”?

Il mio progetto ha una politica di non utilizzare un ramo “principale” (tutti i rami devono avere nomi significativi). Inoltre, il repository master 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 indichi un ramo differente. Questo sta causando due problemi:

  1. Quando clonando il repository, ecco questo,

    avviso: HEAD remoto si riferisce a ref inesistente, non in grado di effettuare il checkout.

    Questo è confuso e scomodo.

  2. Il browser del codice basato sul web dipende da HEAD come base per la navigazione dell’albero. Ho bisogno che HEAD indichi un ramo valido, quindi.

    C’era quasi la stessa domanda su GitHub un anno fa.

    L’idea era di rinominare il ramo principale:

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

    Fare diventare padrone ha ciò che vuoi che le persone usino e fare tutto il resto nelle filiali.

    (un ” git-symbolic-ref HEAD refs/head/published ” non sarebbe propagato al repository remoto)

    Questo è simile a ” Come faccio a eliminare l’origine / master in Git “.


    Come detto in questo thread : (sottolinea il mio)

    git clone ” crea solo un singolo ramo locale.
    Per fare ciò, guarda l’ 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 repo A e clonalo:

    • HEAD riferimenti refs/heads/master e che esiste
      -> si ottiene un ramo locale chiamato master, a partire da origine / master

    • HEAD riferimenti refs/heads/anotherBranch e che esiste
      -> ottieni una filiale locale chiamata anotherBranch , a partire da origin/anotherBranch

    • HEAD riferimenti refs/heads/master e che non esiste
      -> “lamenta git clone”

    Non sono sicuro se c’è un modo per modificare direttamente il ref HEAD in un repository .

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


    Forse l’unico modo sarebbe una “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ò implicherebbe l’accesso in scrittura al server, il che non è sempre ansible.


    Come spiego in ” Git: modo corretto per cambiare il ramo attivo in un repository nudo? “, Git git remote set-head non cambierebbe nulla sul repository remoto.

    Cambierà solo il ramo di localizzazione remota memorizzato localmente nel repository locale, in remotes//HEAD .

    Aggiornamento: funziona solo per la copia locale del repository (il “client”). 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

    Quindi, ad esempio, il passaggio dalla testa origin remota allo develop ramo sarebbe:

    git remote set-head origin develop

    Dato che hai citato GitHub, per farlo sul loro sito, entra nel tuo progetto, quindi …

    admin > Default Branch > (choose something)

    Fatto.

    Vedi: http://www.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html

    Questo imposta il ramo predefinito nel repository git. Puoi eseguirlo in repository nudi o con mirroring.

    USO:

    $ git simbolico-ref HEAD ref / heads /

    (C’era già praticamente la stessa domanda ” creare un git simbolico nel repository remoto “, che non ha ricevuto risposta universale).

    Ma ci sono risposte specifiche per varie “fattorie” git (dove più utenti possono gestire i repository git attraverso un’interfaccia ristretta: tramite 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 chi legge questa pagina e pensa a questi servizi specifici.

    • Ora hanno un menu a discesa per selezionare il ramo HEAD su http://repo.or.cz (esempio: http://repo.or.cz/editproj.cgi?name=for-me-and-for- all_imz.git );
    • e anche su http://gitorious.org (guarda da qualche parte nelle impostazioni);
    • e su http://GitHub.com : admin> Default Branch> (scegli qualcosa) (grazie alla risposta di @ srcspider);
    • Dalla v2.6 , il ramo predefinito può essere impostato nell’interfaccia Web in “Progetti”> “Elenco”>> “Rami” . In v2.12, Gerrit ha aggiunto un nuovo comando set-head che può essere usato su ssh .
    • e in Girar (in esecuzione su http://git.altlinux.org per compilare i pacchetti per la distro di ALT), si può usare l’interfaccia ssh per questo: $ ssh git.alt help | fgrep branch default-branch [] $ $ ssh git.alt help | fgrep branch default-branch [] $ ad esempio ssh git.alt default-branch packages/autosshd.git sisyphus per cambiare l’HEAD nel repository remoto autosshd.git per puntare al ramo sisyphus .

    Se si ha accesso al repository remoto da una shell, basta andare in .git (o nella directory principale se è un repository nudo) e cambiare il file HEAD in modo che punti alla testa corretta. Ad esempio, per impostazione predefinita contiene sempre “refs: refs / heads / master”, ma se hai bisogno di foo per essere l’HEAD, modifica il file HEAD e cambia il contenuto in “refs: refs / heads / foo”.

    È ansible creare un ramo master distaccato utilizzando solo comandi Git porcellana:

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

    Questo ci dà un ramo master con un messaggio scortese (potresti voler essere più gentile). Ora creiamo il nostro ramo “reale” (chiamiamolo tronco in onore di SVN) e lo separiamo dal maestro :

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

    Ehi, presto! gitk: tutti mostreranno master e trunk senza alcun collegamento tra loro.

    La “magia” qui è che –amend causa il commit di git per creare un nuovo commit con lo stesso genitore dell’HEAD corrente, quindi fare in modo che HEAD punti ad esso. Ma l’attuale HEAD non ha un genitore in quanto è il commit iniziale nel repository, quindi il nuovo HEAD non ne ottiene uno, rendendoli distaccati l’uno dall’altro.

    Il vecchio commit HEAD non viene cancellato da git-gc perché refs / heads / master lo punta ancora.

    Il flag –allow-empty è necessario solo perché stiamo commettendo un albero vuoto. Se ci fossero alcune aggiunte git dopo il git rm, allora non sarebbe necessario.

    In realtà, è ansible creare un ramo distaccato in qualsiasi momento, ramificando il commit iniziale nel repository, eliminando il suo albero, aggiungendo l’albero distaccato, quindi eseguendo git commit –amend .

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

    Innanzitutto, crea il nuovo ramo che desideri impostare come predefinito, ad esempio:

    $>git branch main

    Quindi, spingere quel ramo all’origine :

    $>git push origin main

    Ora quando accedi al tuo account GitHub, puoi andare al tuo repository e scegliere Impostazioni> Default Branch e scegliere ” main “.

    Quindi, se lo desideri, puoi eliminare il ramo principale:

    $>git push origin :master

    Per le persone gitolite, la gitolite supporta un comando chiamato – attendi – symbolic-ref . Permette di eseguire quel comando da remoto se si dispone dell’authorization W (scrittura) al repository.

    Semplice, accedi al tuo account GitHub e sul lato destro del menu di navigazione scegli Impostazioni , nella scheda Impostazioni scegli Default Branch e ritorna alla pagina principale del tuo repository che ha fatto il trucco per me.