web-dev-qa-db-fra.com

Changer une télécommande Git HEAD pour indiquer autre chose que master

Comment définir la référence HEAD d'une télécommande Git) de manière à indiquer autre chose que "maître"?

Mon projet a pour politique de ne pas utiliser de branche "principale" (toutes les branches doivent avoir des noms significatifs). En outre, le référentiel maître canonique est uniquement accessible via ssh: //, sans accès Shell (comme GitHub ou Unfuddle).

Mon problème est que le référentiel distant a toujours une référence HEAD à refs/heads/master, mais je dois le faire pointer vers une autre branche. Cela pose deux problèmes:

  1. Lors du clonage du repo, voici ce qui suit:

    warning: remote HEAD fait référence à une référence inexistante, impossible de passer à la caisse.

    C'est déroutant et peu pratique.

  2. Le navigateur de code basé sur le Web dépend de HEAD pour naviguer dans l’arborescence. Il faut donc HEAD pour pointer sur une branche valide, puis.

117
JasonSmith

Il y avait presque le même question sur GitHub il y a un an.

L'idée était de renommer la branche master:

git branch -m master development
git branch -m published master
git Push -f Origin master 

Faire en sorte que maître ait ce que vous voulez que les gens utilisent, et faites tout autre travail dans les branches.

(une "git-symbolic-ref HEAD refs/head/published "ne sera pas propagé au repo distant)

Ceci est similaire à " Comment puis-je supprimer Origin/master dans Git ".


Comme dit dans ce fil : (c'est moi qui souligne)

"git clone "ne crée qu'une seule branche locale.
Pour ce faire, il se penche sur le HEAD ref du référentiel distant et crée une branche locale portant le même nom que la branche distante à laquelle elle fait référence.

Donc, pour conclure, vous devez repo A et le cloner:

  • HEAD références refs/heads/master et qui existe
    -> vous obtenez une branche locale appelée master, commençant par Origin/master

  • HEAD références refs/heads/anotherBranch et qui existe
    -> vous obtenez une branche locale appelée anotherBranch, à partir de Origin/anotherBranch

  • HEAD références refs/heads/master et ça n'existe pas
    -> "git clone" se plaint

Je ne sais pas s'il est possible de modifier directement le HEAD ref dans un dépôt .

(quel est le point de votre question, je sais;))


Peut-être le seul moyen serait un "publication pour les pauvres" , où vous:

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

Mais cela impliquerait un accès en écriture au serveur, ce qui n’est pas toujours possible.


Comme je l'explique dans " Git: bonne façon de changer Active Branch dans un référentiel nu? ", git remote set-head ne changerait rien au repo distant.

Cela modifierait uniquement la branche de suivi à distance stockée localement dans votre dépôt local, dans remotes/<name>/HEAD.

61
VonC

pdate: Ceci ne fonctionne que pour la copie locale du référentiel (le "client"). S'il vous plaît voir les commentaires des autres ci-dessous.

Avec une version récente de git (février 2014), la procédure correcte serait:

git remote set-head $REMOTE_NAME $BRANCH

Ainsi, par exemple, changer la tête de la télécommande Origin vers la branche develop serait:

git remote set-head Origin develop

40
jrhorn424

Puisque vous mentionnez GitHub, pour le faire sur leur site, allez simplement dans votre projet, puis ...

admin > Default Branch > (choose something)

Terminé.

34
srcspider

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

Ceci définit la branche par défaut dans le référentiel git. Vous pouvez l'exécuter dans des référentiels nus ou en miroir.

Usage:

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

(Il y avait déjà fondamentalement la même question " créer une référence symbolique git dans un référentiel distant ", qui n'a pas reçu de réponse universelle.)

Mais il existe des réponses spécifiques pour différentes "fermes" git (où plusieurs utilisateurs peuvent gérer les repos de git via une interface restreinte: via http et ssh): http://Github.com , http://Gitorious.org , http://repo.or.cz , Girar ( http://git.altlinux.org ).

Ces réponses spécifiques pourraient être utiles pour ceux qui lisent cette page et réfléchissent à ces services spécifiques.

Si vous avez accès au référentiel distant à partir d'un shell, accédez simplement au fichier .git (ou au répertoire principal s'il s'agit d'un référentiel nu) et modifiez le fichier HEAD pour qu'il pointe vers le bon en-tête. Par exemple, par défaut, il contient toujours 'refs: refs/heads/master', mais si vous avez besoin que foo soit le HEAD à la place, éditez simplement le HEAD = file et change le contenu en 'refs: refs/heads/foo'.

7
squeegee

Vous pouvez créer une branche détachée master en utilisant uniquement les commandes Git en porcelaine:

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

Cela nous donne une branche master avec un message grossier (vous voudrez peut-être être plus poli). Maintenant, nous créons notre "vraie" branche (appelons-la trunk en l'honneur de SVN) et la séparons de master:

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

Hé, hop! gitk --all montrera maître et trunk sans lien entre eux.

La "magie" est ici que - amender provoque git commit créer un nouveau commit avec le même parent que le HEAD actuel, puis make HEAD Le point actuel HEAD n'a pas de parent car c'est la validation initiale dans le référentiel, donc le nouveau HEAD ne t en obtenir un non plus, les rendant détachés les uns des autres.

L'ancien HEAD commit ne sera pas supprimé par git-gc car refs/heads/master y pointe toujours.

L’indicateur - allow-empty n’est nécessaire que parce que nous commettons un arbre vide. S'il y avait quelques ajout de git après le git rm, alors ce ne serait pas nécessaire.

En vérité, vous pouvez créer une branche détachée à tout moment en ramifiant le commit initial dans le référentiel, en supprimant son arborescence, en ajoutant votre arborescence détachée, puis en faisant git commit --amend.

Je sais que cela ne répond pas à la question de savoir comment modifier la branche par défaut sur le référentiel distant, mais donne une réponse claire sur la manière de créer une branche détachée.

5
kbro

Commencez par créer la nouvelle branche que vous souhaitez définir par défaut, par exemple:

$>git branch main

Ensuite, poussez cette branche vers le Origine:

$>git Push Origin main

Maintenant, lorsque vous vous connectez à votre compte GitHub, vous pouvez aller dans votre référentiel et choisir Paramètres> Branche par défaut et choisir "principale. "

Ensuite, si vous le souhaitez, vous pouvez supprimer la branche principale:

$>git Push Origin :master

2
4mnes7y

Pour les gens de gitolite, gitolite supporte une commande appelée - attendez-la - symbolic-ref. Il vous permet d'exécuter cette commande à distance si vous disposez du droit W (écriture) sur le référentiel.

0
sitaram