S'il existe un référentiel auquel j'ai uniquement git://
accès (et que je ne fais que pousser + tirer), existe-t-il un moyen de renommer les branches de ce référentiel de la même manière que je le ferais localement git branch -m
?
407
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
.Réponses:
Il vous suffit de créer une nouvelle branche locale avec le nom souhaité, de la pousser vers votre télécommande, puis de supprimer l'ancienne branche distante:
Ensuite, pour voir l'ancien nom de branche, chaque client du référentiel devrait faire:
REMARQUE: si votre ancienne branche est votre branche principale, vous devez modifier vos paramètres de branche principale. Sinon, lorsque vous exécutez
$ git push origin :old-branch-name
, vous obtenez l'erreur "suppression de la branche actuelle interdite" .la source
git fetch origin --prune
(pour récupérer efficacement les nouvelles branches et également se débarrasser des références qui ne se trouvent plus sur la télécommande).-d
ou--delete
au lieu de:
dans les versions plus récentes de git.Si vous voulez vraiment renommer des branches à distance, sans renommer de branches locales en même temps , vous pouvez le faire avec une seule commande:
J'ai écrit ce script ( git-rename-remote-branch ) qui fournit un raccourci pratique pour faire ce qui précède facilement.
En tant que fonction bash:
Pour intégrer le commentaire de @ ksrb : Ce que cela fait, c'est essentiellement deux poussées dans une seule commande, d'abord
git push <remote> <remote>/<old_name>:refs/heads/<new_name>
pour pousser une nouvelle branche distante basée sur l'ancienne branche de suivi à distance, puisgit push <remote> :<old_name>
pour supprimer l'ancienne branche distante.la source
git push <remote>/<old_name>:refs/heads/<new_name>
signifie pousser une nouvelle télécommande qui utilise l'ancienne télécommande comme src, puisgit push [space]:<old_name>
supprimer l'ancienne télécommanderefs/heads/name
? Ne pouvez-vous pas simplement utilisername
directement la première commandegit push <remote> <remote>/<old_name>:<new_name>
?<new_name>
n'existe pas encore. Si la branche n'existe pas, Git vous oblige à utiliser le nom complet car sinon, vous<new_name>
pourriez également faire référence à un nom de balise.refs/heads/<new_name>
existe déjà. La suppression réussit toujours, entraînant<remote>/<old_name>
uniquement sa suppression. Une vérification préalable peut facilement éviter cela.Tout d'abord, passez à la succursale que vous souhaitez renommer:
Pour supprimer une ancienne branche de
remote
:la source
git push -u origin new_branch
) sinon la branche renommée (new_branch) continuera à suivre l'origine / old_branch. Et une fois que vous supprimez le old_branch distant, le new_branch suivra toujours l'origine / old_branch, même si maintenant cette branche a disparu.Sûr. Renommez simplement la branche localement, appuyez sur la nouvelle branche et appuyez sur une suppression de l'ancienne.
Le seul vrai problème est que les autres utilisateurs du référentiel n'auront pas de branches de suivi locales renommées.
la source
TL; DR
"Renommer" une branche distante est en fait un processus en 2 étapes (pas nécessairement ordonné):
git push [space]:<old_name>
comme l' explique ksrb );Suppression
J'utilise TortoiseGit et quand j'ai essayé pour la première fois de supprimer la branche via la ligne de commande, j'ai obtenu ceci:
Cela était probablement dû au fait que pageant n'a pas chargé la clé privée (que TortoiseGit charge automatiquement dans pageant ). De plus, j'ai remarqué que les commandes TortoiseGit n'ont pas la
origin
référence (par exemplegit.exe push --progress "my_project" interesting_local:interesting
).J'utilise également Bitbucket et, comme d'autres gestionnaires de git en ligne sur le Web (GitHub, GitLab), j'ai pu supprimer la branche distante directement via leur interface (page branches):
Cependant, dans TortoiseGit, vous pouvez également supprimer des branches distantes via Parcourir les références :
En cliquant avec le bouton droit sur une branche distante (liste des télécommandes), l' option Supprimer la branche distante apparaît:
Pousser
Après avoir supprimé l'ancienne branche distante, j'ai poussé directement dans une nouvelle branche distante via TortoiseGit simplement en tapant le nouveau nom dans le champ Remote: de la fenêtre Push et cette branche a été automatiquement créée et visible dans Bitbucket .
Cependant, si vous préférez toujours le faire manuellement, un point qui n'a pas encore été mentionné dans ce fil est que
-u
=--set-upstream
.De la
git push
documentation ,-u
est juste un alias de--set-upstream
, donc les commandes dans les réponses de Sylvain (-set-upstream new-branch
) et Shashank (-u origin new_branch
) sont équivalentes, car la référence dist par défaut estorigin
si aucune autre référence n'a été précédemment définie:git push origin -u new_branch
= àgit push -u new_branch
partir de la description des documents :En fin de compte, je n'ai pas tapé ou utilisé manuellement les commandes suggérées par les autres réponses ici, donc cela pourrait être utile à d'autres dans une situation similaire.
la source
origin
. Vous devez nommer votre télécommande lorsque vous l'obtiendrez en exécutant la commandegit remote
. Git fonctionne avecssh
ce qui implique que vous utilisez des clés publiques + privées. Je suppose queAutoload Putty keys
TortoiseGit ne fait que charger automatiquement les clés nécessaires pour que vous puissiez faire quoi que ce soit avec votre référence à distance. La dernière chose est que cegit push -u
n'est pas un alias pour pousser dans une branche distante, c'est un alias pour pousser dans une branche distante qui a été créée localement et sa référence distante n'a pas encore cette branche .-u
est un alias de--set-upstream
et "si la configuration est manquante, elle est par défautorigin
". Sylvain et Shashank l' utilisent pour pousser dans une branche distante nouvellement créée . Le problème clé peut être dû au fait que Pageant ne l' a pas chargé lorsque j'ai essayégit push origin :in
le shell. Je ne comprends donc pas votre downvote, je viens de souligner les détails non traités dans les autres réponses, de les expliquer et de les résoudre.-u
est un alias pour--set-upstream
mais ce n'est pas un alias pour pousser dans une branche distante comme vous l'avez dit. Pour pousser dans une branche distante, vous avez uniquement besoingit push <remote>
, et si ce n'est pas encore dans la télécommande, vous ajoutezgit push -u <remote>
. Par conséquent,-u
est utilisé pour créer une référence de la branche dans la télécommande.Je ne sais pas pourquoi mais la réponse de @Sylvain Defresne ne fonctionne pas pour moi.
Je dois désamorcer l'amont, puis je peux à nouveau définir le flux. Voici comment je l'ai fait.
la source
Je ne sais pas si c'est vrai ou faux, mais j'ai poussé "l'ancien nom" de la branche vers le "nouveau nom" de la branche, puis j'ai supprimé l'ancienne branche entièrement avec les deux lignes suivantes:
la source
Vous pouvez créer une nouvelle branche basée sur l'ancienne branche. Juste comme ça, puis supprimez l'ancienne branche, c'est fini !!!
la source
En plus des réponses déjà données, voici une version qui vérifie d'abord si la nouvelle branche existe déjà (afin que vous puissiez l'utiliser en toute sécurité dans un script)
(le chèque provient de cette réponse )
la source
git show-ref --quiet --verify -- refs/heads/$new_name
au lieu dels-remote | cut | sed | grep
.