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
?
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
?
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:
$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name
Luego, para ver el nombre de la rama anterior, cada cliente del repositorio tendría que hacer:
$ git fetch origin
$ git remote prune origin
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" .
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:
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>
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:
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
}
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 luego git push <remote> :<old_name>
eliminar la rama remota anterior.
git push <remote>/<old_name>:refs/heads/<new_name>
significa empujar un nuevo control remoto que usa el control remoto anterior como un src, luego git push [space]:<old_name>
significa eliminar el control remoto anterior
refs/heads/name
? ¿No puedes usar name
directamente, haciendo el primer comando git 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:
git branch -m old_branch new_branch
git push -u origin new_branch
Para eliminar una rama vieja de remote
:
git push origin :old_branch
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.
"Renombrar" una rama remota es realmente un proceso de 2 pasos (no necesariamente ordenado):
git push [space]:<old_name>
como explica ksrb );Uso TortoiseGit y cuando intenté eliminar la rama por primera vez a través de la línea de comando, obtuve esto:
$ git push origin :in
fatal: 'origen' no parece ser un repositorio git
fatal: no se pudo leer desde el repositorio remoto.
Asegúrese de tener los derechos de acceso correctos y de que exista el repositorio.
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 ejemplo git.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 :
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 :
Si falta la configuración, su valor predeterminado es
origin
.
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.
origin
. Debe asignar un nombre a su control remoto a medida que lo obtiene al ejecutar el comando git remote
. Git funciona con ssh
lo que implica que estás usando claves públicas + privadas. Supongo que Autoload Putty keys
TortoiseGit solo carga automáticamente las teclas necesarias para que pueda hacer algo con su referencia remota. Lo último es que git 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 exclusiva git push <remote>
, y si aún no está en el remoto, agrega git 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.
git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name
Tengo que desarmar el flujo ascendente y luego puedo configurar el flujo nuevamente. Lo siguiente es cómo lo hice.
git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name
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:
git push origin old_branch:new_branch
git push origin :old_branch
Puede crear una nueva rama basada en una rama de nombre antiguo. ¡Así como así, luego borre la rama anterior, sobre !!!
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)
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"
(el cheque es de esta respuesta )
git show-ref --quiet --verify -- refs/heads/$new_name
lugar de ls-remote | cut | sed | grep
.
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
.