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
?
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
?
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:
$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name
Ensuite, pour voir l'ancien nom de branche, chaque client du référentiel devrait faire:
$ git fetch origin
$ git remote prune origin
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" .
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:
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>
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:
git-rename-remote-branch(){
if [ $# -ne 3 ]; then
echo "Rationale : Rename a branch on the server without checking it out."
echo "Usage : $(basename $0) <remote> <old name> <new name>"
echo "Example : $(basename $0) origin master release"
exit 1
fi
git push $1 $1/$2:refs/heads/$3 :$2
}
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, puis git push <remote> :<old_name>
pour supprimer l'ancienne branche distante.
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, puis git push [space]:<old_name>
supprimer l'ancienne télécommande
refs/heads/name
? Ne pouvez-vous pas simplement utiliser name
directement la première commande git 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:
git branch -m old_branch new_branch
git push -u origin new_branch
Pour supprimer une ancienne branche de remote
:
git push origin :old_branch
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.
"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 );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:
$ git push origin :in
fatal: 'origin' ne semble pas être un dépôt git
fatal: impossible de lire à partir du référentiel distant.
Veuillez vous assurer que vous disposez des droits d'accès appropriés et que le référentiel existe.
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 exemple git.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:
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 :
Si la configuration est manquante, elle est par défaut
origin
.
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.
origin
. Vous devez nommer votre télécommande lorsque vous l'obtiendrez en exécutant la commande git remote
. Git fonctionne avec ssh
ce qui implique que vous utilisez des clés publiques + privées. Je suppose que Autoload 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 ce git 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 besoin git push <remote>
, et si ce n'est pas encore dans la télécommande, vous ajoutez git 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.
git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name
Je dois désamorcer l'amont, puis je peux à nouveau définir le flux. Voici comment je l'ai fait.
git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name
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:
git push origin old_branch:new_branch
git push origin :old_branch
Vous pouvez créer une nouvelle branche basée sur l'ancienne branche. Juste comme ça, puis supprimez l'ancienne branche, c'est fini !!!
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)
if git ls-remote --heads "$remote" \
| cut -f2 \
| sed 's:refs/heads/::' \
| grep -q ^"$newname"$; then
echo "Error: $newname already exists"
exit 1
fi
git push "$oldname" "$remote/$oldname:refs/heads/$newname" ":$oldname"
(le chèque provient de cette réponse )
git show-ref --quiet --verify -- refs/heads/$new_name
au lieu de ls-remote | cut | sed | grep
.
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
.