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:
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.
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.
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 leHEAD 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érencesrefs/heads/master
et qui existe
-> vous obtenez une branche locale appelée master, commençant par Origin/masterHEAD références
refs/heads/anotherBranch
et qui existe
-> vous obtenez une branche locale appeléeanotherBranch
, à partir deOrigin/anotherBranch
HEAD références
refs/heads/master
et ça n'existe pas
-> "git clone" se plaintJe 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
.
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
Puisque vous mentionnez GitHub, pour le faire sur leur site, allez simplement dans votre projet, puis ...
admin > Default Branch > (choose something)
Terminé.
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>
(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.
$ ssh git.alt help | fgrep branch default-branch <path to git repository> [<branch>] $
par exemple ssh git.alt default-branch packages/autosshd.git sisyphus
pour changer le HEAD dans le référentiel distant autosshd.git
pour pointer sur la branche sisyphus
.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'.
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.
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
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.