J'ai un référentiel nu utilisé comme magasin central pour mon projet. Tous les développeurs font git clone <repo>
pour partager avec elle. Quand ils font le clone, ils obtiennent une extraction de la branche principale (à moins qu'ils le fassent git clone -n
) car repo.git/HEAD
contient ref: refs/heads/master
, ce qui en fait la branche active .
La question est, comment puis-je changer la branche active correctement? Je pourrais simplement pirater le repo.git/HEAD
fichier directement, mais cela semble méchant et, bien, hacky.
J'ai essayé de faire git checkout <otherbranch>
dans le .git
répertoire repo , 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 juste mis à jour refs / heads / master pour être le même que refs / heads / otherbranch (ok, j'ai fait celui-ci dans un dépôt factice, pas celui de production!)
J'ai essayé git update-ref --no-deref HEAD refs/heads/otherbranch
et ça a presque fonctionné. Il a mis à jour le HEAD
fichier, mais il l'a défini sur le SHA1 de la validation pointée par refs/heads/otherbranch
.
Je teste avec la version git 1.7.0.2.msysgit.0
.
Je suppose qu'il n'y a aucun moyen de le faire git push
, car autoriser tout le monde à changer votre branche par défaut semble un peu dangereux (!), Mais il y a sûrement une meilleure façon de le faire dans le .git
répertoire repo que de pirater directement le HEAD
fichier.
Réponses:
Si vous avez accès au référentiel nu à distance, cet article suggère :
comme documenté dans le
git-symbolic-ref
Si vous n'avez pas accès au référentiel distant, consultez ma réponse précédente .
N'oubliez pas qu'une commande comme
git remote set-head
:ne change pas la branche par défaut du dépôt distant .
Il modifie uniquement une branche de suivi à distance stockée dans votre référentiel local comme
refs/remotes/<name>/HEAD
ne se change pas
HEAD
(encore, seulementrefs/remotes/<name>/HEAD
), d'où la nécessité degit symbolic-ref
.Ce
git remote set-head
n'est donc pas la réponse ici.git symbolic-ref HEAD
est, si vous avez un accès direct au référentiel distant.la source
git symbolic-ref HEAD refs/heads/mybranch
a très bien fonctionné pour moi! MERCI! ;)Pour modifier la branche, vous devez remplacer la référence HEAD par la branche que vous souhaitez utiliser.
Listez d'abord toutes les références dans le référentiel nu en faisant
Trouvez ensuite la référence de votre branche, le format sera le suivant
refs/heads/<my_branch>
. La prochaine étape consiste donc à vérifier la référence actuelle, il suffit de taper:afin que vous sachiez quelle est la branche actuelle, puis mettez-la à jour si nécessaire.
Thant c'est tout. Prendre plaisir.
la source
Comment changer la branche active correctement?
status: git checkout dans le répertoire repo .git renvoie fatal: cette opération doit être exécutée dans une arborescence de travail
conseils: ajoutez simplement l'argument --work-tree
exemple détaillé: hypothèses: bare git sur serveur distant:
sur le serveur local: créer la branche version 1.7 (notre autre branche)
git branch version.1.7
git push origin version.1.7
sur le serveur distant avec git bare repo:
$ cd ~ / bare_git_repository.git
$ git branch
version.1.7
Comme indiqué, suite à la commande
git checkout version.1.7
revenir
fatal: cette opération doit être exécutée dans une arborescence de travail
Utilisation de la commande suivante
modifier correctement la branche active
$ git branch
Maître
vérifier les résultats avec ce qui suit
j'espère que cela vous aidera
la source
De plus, si vous n'avez pas accès au référentiel nu, en faisant un
git remote set-head
et vous avez terminéVoir cette réponse précédente
la source
J'ai également un dépôt nu sur notre serveur et j'ai réussi à récupérer des fichiers en utilisant
dans un nouveau référentiel local même si la page de manuel indique que ce n'est que pour les référentiels non nus.
la source
J'ai comparé deux répertoires avant et après avoir postulé
git symbolic-ref HEAD refs/heads/mybranch
et il semble que seul le fichier repo.git / HEAD ait été modifié, il est donc très sûr de "pirater" le fichier.
la source