2010-07-21 4 views
161

J'ai un dépôt nu qui est utilisé comme magasin central pour mon projet. Tous les développeurs font git clone <repo> pour partager avec lui. Quand ils font le clone, ils obtiennent une caisse de la branche principale (à moins qu'ils ne git clone -n) car repo.git/HEAD contient ref: refs/heads/master, ce qui représente la Direction active.Git: Manière correcte de changer Active Branch dans un référentiel nu?

La question est, comment puis-je changer le Active Branch correctement? Je pourrais simplement pirater le fichier repo.git/HEAD directement, mais cela semble méchant et, bien, hacky.

J'ai essayé de faire git checkout <otherbranch> dans le répertoire repo .git, mais cela a échoué car je n'étais pas dans un arbre de travail.

J'ai essayé git update-ref HEAD refs/heads/otherbranch mais refs juste mis à jour/têtes/maître être le même que refs/heads/otherbranch (d'accord, je l'ai fait un dans un dépôt factice, pas ma seule production!)

j'ai essayé git update-ref --no-deref HEAD refs/heads/otherbranch et cela a presque fonctionné. Il a mis à jour le fichier HEAD, mais il l'a défini sur le SHA1 de la validation pointé par refs/heads/otherbranch.

Je teste la version git 1.7.0.2.msysgit.0.

Je devine qu'il n'y a pas moyen de le faire à travers git push, en permettant tout le monde pour changer votre branche par défaut semble un peu dangereux (!), Mais sûrement il y a une meilleure façon de le faire dans le répertoire repo .git que piratage direct du fichier HEAD.

+0

IMO vous essayez fondamentalement de faire The Wrong Thing ici. Si vous voulez que la branche par défaut soit différente de master, cette branche doit être le maître. Vous pouvez également utiliser deux référentiels différents. –

+10

Comment est-ce fondamentalement essayer de faire la mauvaise chose ici? Un référentiel nu prend en charge plusieurs branches. J'utilise un dépôt nu comme sauvegarde de mon dépôt local, et en tant que tel, je représente les branches. J'ai un master sur les deux et une branche de développement sur les deux. Si je veux voir le journal de la branche de développement sur le référentiel nu, je dois pirater les fichiers - semble que git est fondamentalement faux ici en ce qui concerne le support de référentiel nu. – Cthutu

+11

@NicholasKnight IMHO vous avez fondamentalement tort ici. Il n'y a rien de spécial à propos de "master" en tant que nom de branche, c'est juste un défaut. Dans les respositories qui gèrent, nous n'avons pas de branche master, car "master" n'a pas de signification pour l'entreprise. Chaque fois que nous faisons une version, nous créons une nouvelle branche de maintenance avec le nouveau numéro de version, et l'assignons comme branche active. – Spacemoose

Répondre

235

Si vous avez accès à la prise en pension à distance nue, ce article suggests:

git symbolic-ref HEAD refs/heads/mybranch 

qui mettra à jour le fichier HEAD dans votre référentiel afin qu'il contient:

ref: refs/heads/mybranch 

comme documenté dans le git-symbolic-ref


Si vous n'avez pas accès à la prise en pension à distance, voir my previous answer.


Rappelez-vous qu'une commande comme git remote set-head:

  • ne change pas la branche par défaut du repo à distance.
    Il change seulement branche de suivi à distance stocké dans votre locale repo refs/remotes/<name>/HEAD

  • ne se change pas HEAD (encore une fois, ne refs/remotes/<name>/HEAD), d'où la nécessité de git symbolic-ref.

Alors git remote set-headn'est pas la réponse ici.
git symbolic-ref HEAD est, si vous avez un accès direct au dépôt à distance.

+3

Merci! J'ai un accès direct au repo nu distant afin que git-symbolic-ref fasse le travail. J'aime l'astuce non-commun-ancêtre mentionnée sur l'autre fil, bien sûr - une pour le tiroir du bas. J'ai passé des années à googler pour cela mais je n'ai pas trouvé votre réponse précédente, mais "git remote head master" la trouve en deuxième position, juste en dessous de git-remote (1). Bizarre. Juste pour montrer combien il est difficile de trouver quelque chose quand vous ne savez pas exactement ce que vous cherchez. – kbro

+0

'git symbolique-ref HEAD refs/heads/mybranch' a très bien fonctionné pour moi! MERCI! ;) – vinzenzweber

+1

J'apprécie vraiment cette question, parce que j'ai accidentellement vérifié une branche différente de * master * et maintenant je devais résoudre ce problème. –

-4

j'ai comparé deux répertoires avant et après l'application

git symbolic-ref HEAD refs/heads/mybranch

et il semble que seul repo.git/fichier HEAD a été modifiée de manière sans doute, il est tout à fait sûr juste « pirater » le fichier.

+2

Il existe des problèmes de rupture subtils qui peuvent être introduits en modifiant directement les fichiers ref de Git. Je recommande fortement contre cela. Les commandes de plomberie sont plus faciles et plus sûres que la modification directe des références. –

+2

Quel est l'avantage de ce @boryn? –

+2

Git garde trace de beaucoup de choses en arrière-plan comme une histoire de refs. Si vous modifiez manuellement le fichier, il ne sera pas connecté. C'est vrai que ça n'aura probablement pas d'importance. Mais si vous perdez la trace de certains commits et que vous voulez les trouver, vous serez plus heureux si vous n'avez pas simplement "piraté" le fichier. – qwerty9967

0

Aussi, si vous ne disposez pas d'accès au dépôt nu, en faisant une git remote set-head et vous avez terminé

Voir cette précédente response

-3

J'ai aussi un repo nu sur notre serveur et a pu pour récupérer avec succès des fichiers en utilisant

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

dans un nouveau dépôt local, même si des pages de manuel cela ne concerne que les dépôts non-nus.

+1

Alors que ce que vous dites est vrai, le fait que vous utilisiez -b pour sélectionner une branche particulière casse votre réponse dans le contexte de ma question, qui est de savoir comment définir la branche DEFAULT. – kbro

0

Pour modifier la branche, vous devez modifier la référence HEAD à la branche que vous souhaitez utiliser.

La première liste toutes les références dans le référentiel nu en faisant

$find ref 

Ensuite, trouvez la référence de votre branche, le format sera le suivant refs/heads/<my_branch>. Donc, l'étape suivante consiste à vérifier la référence actuelle, il suffit de taper:

$git symbolic-ref HEAD 

de sorte que vous savez qui est la branche courante puis mettre à jour au besoin.

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

Thant est-il. Prendre plaisir.

Questions connexes