Si hay un repositorio al que solo tengo git://
acceso (y generalmente solo presionaría + jalar), ¿hay alguna forma de cambiar el nombre de las sucursales en ese repositorio de la misma manera que lo haría localmente git branch -m
?
407
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
.Respuestas:
Solo tiene que crear una nueva sucursal local con el nombre deseado, insertarla en su control remoto y luego eliminar la rama remota anterior:
Luego, para ver el nombre de la rama anterior, cada cliente del repositorio tendría que hacer:
NOTA: Si su rama anterior es su rama principal, debe cambiar la configuración de su rama principal. De lo contrario, cuando ejecute
$ git push origin :old-branch-name
, obtendrá el error "se prohíbe la eliminación de la rama actual" .fuente
git fetch origin --prune
(para buscar efectivamente las nuevas ramas y también deshacerse de las referencias que ya no están en el control remoto).-d
o en--delete
lugar de:
en versiones más nuevas de git.Si realmente solo desea cambiar el nombre de las sucursales de forma remota, sin cambiar el nombre de las sucursales locales al mismo tiempo , puede hacerlo con un solo comando:
Escribí este script ( git-rename-remote-branch ) que proporciona un práctico acceso directo para hacer lo anterior fácilmente.
Como una función bash:
Para integrar el comentario de @ksrb : lo que esto básicamente hace es dos empujes en un solo comando, primero
git push <remote> <remote>/<old_name>:refs/heads/<new_name>
para empujar una nueva rama remota basada en la antigua rama de seguimiento remoto y luegogit push <remote> :<old_name>
eliminar la rama remota anterior.fuente
git push <remote>/<old_name>:refs/heads/<new_name>
significa empujar un nuevo control remoto que usa el control remoto anterior como un src, luegogit push [space]:<old_name>
significa eliminar el control remoto anteriorrefs/heads/name
? ¿No puedes usarname
directamente, haciendo el primer comandogit push <remote> <remote>/<old_name>:<new_name>
?<new_name>
aún no existe. Si la rama no existe, Git requiere que use el nombre completo, ya que de lo contrario<new_name>
también podría referirse a un nombre de etiqueta.refs/heads/<new_name>
ya existe. La eliminación aún tiene éxito, lo que resulta en que<remote>/<old_name>
solo se elimine. Algunas comprobaciones antes de la mano pueden evitar esto fácilmente.Primer pago a la rama a la que desea cambiarle el nombre:
Para eliminar una rama vieja de
remote
:fuente
git push -u origin new_branch
), de lo contrario la rama renombrada (new_branch) continuará rastreando el origen / old_branch. Y una vez que elimine el old_branch remoto, el new_branch seguirá rastreando el origen / old_branch, aunque ahora esa rama haya desaparecido.Por supuesto. Simplemente cambie el nombre de la rama localmente, presione la nueva rama y presione una eliminación de la antigua.
El único problema real es que otros usuarios del repositorio no cambiarán el nombre de las ramas de seguimiento locales.
fuente
TL; DR
"Renombrar" una rama remota es realmente un proceso de 2 pasos (no necesariamente ordenado):
git push [space]:<old_name>
como explica ksrb );Borrando
Uso TortoiseGit y cuando intenté eliminar la rama por primera vez a través de la línea de comando, obtuve esto:
Esto probablemente se debió a que el concurso no tenía cargada la clave privada (que TortoiseGit carga automáticamente en el concurso ). Además, noté que los comandos de TortoiseGit no tienen la
origin
referencia en ellos (por ejemplogit.exe push --progress "my_project" interesting_local:interesting
).También estoy usando Bitbucket y, como otros administradores de git en línea basados en la web (GitHub, GitLab), pude eliminar la rama remota directamente a través de su interfaz (página de ramas):
Sin embargo, en TortoiseGit también puede eliminar ramas remotas a través de las referencias de exploración :
Al hacer clic derecho en una rama remota (lista de controles remotos), aparece la opción Eliminar rama remota :
Emprendedor
Después de eliminar la antigua rama remota, empujé directamente a una nueva rama remota a través de TortoiseGit simplemente escribiendo el nuevo nombre en el campo Remoto: de la ventana Empujar y esta rama se creó automáticamente y fue visible en Bitbucket .
Sin embargo, si aún prefiere hacerlo manualmente, un punto que aún no se ha mencionado en este hilo es que
-u
=--set-upstream
.De los
git push
documentos ,-u
es solo un alias de--set-upstream
, por lo que los comandos en las respuestas de Sylvain (-set-upstream new-branch
) y Shashank (-u origin new_branch
) son equivalentes, ya que la referencia remota se establece de manera predeterminadaorigin
si no se definió previamente ninguna otra referencia:git push origin -u new_branch
=git push -u new_branch
de la descripción de los documentos :Al final, no escribí manualmente ni utilicé ninguno de los comandos sugeridos por las otras respuestas aquí, por lo que quizás esto podría ser útil para otros en una situación similar.
fuente
origin
. Debe asignar un nombre a su control remoto a medida que lo obtiene al ejecutar el comandogit remote
. Git funciona conssh
lo que implica que estás usando claves públicas + privadas. Supongo queAutoload Putty keys
TortoiseGit solo carga automáticamente las teclas necesarias para que pueda hacer algo con su referencia remota. Lo último es quegit push -u
no es un alias para ingresar a una rama remota, es un alias para ingresar a una rama remota que se creó localmente y su referencia remota aún no tiene esta rama .-u
es un alias de--set-upstream
y "si falta la configuración, su valor predeterminado esorigin
". Sylvain y Shashank usan esto para ingresar a una rama remota recién creada . El problema clave puede deberse a que el concurso no lo cargó cuando lo intentégit push origin :in
en el shell. Entonces, no entiendo su voto negativo, solo señalé los detalles míos y no abordados en otras respuestas, los expliqué y los resolví.-u
es un alias para--set-upstream
pero no es un alias para empujar a una rama remota como dijiste. Para ingresar a una rama remota que necesita de forma exclusivagit push <remote>
, y si aún no está en el remoto, agregagit push -u <remote>
. Por lo tanto,-u
se utiliza para crear una referencia de la rama en el control remoto.No sé por qué, pero la respuesta de @Sylvain Defresne no me funciona.
Tengo que desarmar el flujo ascendente y luego puedo configurar el flujo nuevamente. Lo siguiente es cómo lo hice.
fuente
No sé si esto es correcto o incorrecto, pero empujé el "nombre antiguo" de la rama al "nombre nuevo" de la rama, luego eliminé la rama vieja por completo con las dos líneas siguientes:
fuente
Puede crear una nueva rama basada en una rama de nombre antiguo. ¡Así como así, luego borre la rama anterior, sobre !!!
fuente
Agregando a las respuestas ya dadas, aquí hay una versión que primero verifica si la nueva rama ya existe (para que pueda usarla con seguridad en un script)
(el cheque es de esta respuesta )
fuente
git show-ref --quiet --verify -- refs/heads/$new_name
lugar dels-remote | cut | sed | grep
.