Cambie un HEAD remoto de Git para que apunte a algo además del maestro

10 minutos de lectura

Cambie un HEAD remoto de Git para que apunte a
jasonsmith

¿Cómo configuro la referencia HEAD de un control remoto Git para que apunte a algo además de “maestro”?

Mi proyecto tiene una política de no usar una rama “maestra” (todas las ramas deben tener nombres significativos). Además, solo se puede acceder al repositorio maestro canónico a través de ssh://, sin acceso de shell (como GitHub o Unfuddle).

Mi problema es que el repositorio remoto todavía tiene una referencia HEAD a refs/heads/master, pero necesito que apunte a una rama diferente. Esto está causando dos problemas:

  1. Al clonar el repositorio, hay esto,

    advertencia: el HEAD remoto se refiere a una referencia inexistente, no se puede pagar.

    Eso es confuso e inconveniente.

  2. El navegador de código basado en web depende de HEAD como base para navegar por el árbol. Necesito HEAD para apuntar a una rama válida, entonces.

  • Acabo de agregar una posibilidad para el registro, pero no es adecuada para su caso.

    – VoC

    28 de septiembre de 2009 a las 6:20

  • Truco “sin ancestro común”: interesante. Puede publicarlo como una respuesta detallada y seleccionarlo como el oficial si encuentra que funciona.

    – VoC

    28 de septiembre de 2009 a las 6:48

  • FWIW, ya que mencionó a GitHub en la pregunta: si desea cambiar la referencia de HEAD en GitHub, simplemente vaya a la pantalla “Administrador” del repositorio y cambie el menú desplegable “Rama predeterminada” a la rama a la que desea que HEAD apunte.

    – José

    25 de junio de 2012 a las 15:17

  • Ver también ayuda.github.com/articulos/…

    – Tino

    1 de julio de 2012 a las 13:26

  • posible duplicado de crear una referencia simbólica de git en un repositorio remoto

    – Ciro Santilli Путлер Капут 六四事

    2 de febrero de 2014 a las 22:52

Cambie un HEAD remoto de Git para que apunte a
VonC

Casi había la misma pregunta en GitHub Hace un año.

La idea era cambiar el nombre de la rama maestra:

git branch -m master development
git branch -m published master
git push -f origin master 

Hacer que el maestro tenga lo que quiere que la gente use y hacer todo el resto del trabajo en las sucursales.

(a “git-symbolic-ref HEAD refs/head/published” no se propagaría al repositorio remoto)

Esto es similar a “¿Cómo elimino origin/master en Git?“.


como se dijo en este hilo: (énfasis mío)

git clone” crea solo una sucursal local.
Para hacer eso, mira el HEAD ref del repositorio remoto y crea una sucursal local con el mismo nombre que la sucursal remota a la que hace referencia.

Entonces, para terminar, tienes un repositorio A y clonarlo:

  • HEAD referencias refs/heads/master y eso existe
    -> obtienes una sucursal local llamada masterempezando desde origin/master

  • referencias HEAD refs/heads/anotherBranch y eso existe
    -> obtienes una sucursal local llamada anotherBranchempezando desde origin/anotherBranch

  • referencias HEAD refs/heads/master y eso no existe
    -> “git clone” se queja

No estoy seguro si hay alguna forma de modificar directamente el HEAD referencia en un repositorio.

(que es el punto de su pregunta, lo sé;))


Quizás la única manera sería una “publicación para los pobres”donde tu:

 $ git-symbolic-ref HEAD refs/head/published
 $ git-update-server-info
 $ rsync -az .git/* server:/local_path_to/git/myRepo.git/

Pero eso implicaría acceso de escritura al servidor, lo que no siempre es posible.


Como explico en “Git: ¿Forma correcta de cambiar Active Branch en un repositorio simple?”, git remote set-head no cambiaría nada en el repositorio remoto.

Solo cambiaría la rama de seguimiento remoto almacenada localmente en su repositorio local, en remotes/<name>/HEAD.


Con Git 2.29 (cuarto trimestre de 2020), “git remote set-head(hombre)“que falló todavía dijo algo que insinúa que la operación se llevó a cabo, lo cual fue engañoso.

Ver cometer 5a07c6c (17 sep 2020) por Christian Schlack (cschlack).
(Combinado por Junio ​​C Hamano — gitster en cometer 39149df22 de septiembre de 2020)

remote: no mostrar mensaje de éxito cuando set-head falla

Firmado por: Christian Schlack

Suprima el mensaje ‘origen/HEAD configurado como maestro’ en caso de error.

$ git remote set-head origin -a
error: Not a valid ref: refs/remotes/origin/master
origin/HEAD set to master

  • Gracias, VonC. Lo leí antes de publicar aquí. Pero como puede ver, una rama llamada “maestro” no es bienvenida en este proyecto por razones técnicas y de política.

    – Jason Smith

    28 de septiembre de 2009 a las 5:57

  • Luego, podría aplicar esa política al no permitir ninguna actualización en la rama maestra a través de un gancho de confirmación previa.

    – VoC

    28 de septiembre de 2009 a las 5:58

  • Sí, si resulta que no hay forma de hacer lo que quiero, haré exactamente eso y aceptaré tu respuesta. ¡Gracias por seguirnos!

    – Jason Smith

    28 de septiembre de 2009 a las 6:06

  • Gracias por la actualización. Por el momento, utilicé el truco “no-common-ancestor” para crear una rama maestra con solo una confirmación. (Es decir: git branch -D master; echo ref: refs/heads/master > .git/HEAD; rm *). Luego toqué un archivo llamado GO_AWAY, y el mensaje de confirmación explica la situación. Eso funcionará por ahora. Puedo verificar a través de la fuente y rastrear dónde el lado receptor establece HEAD para una respuesta final.

    – Jason Smith

    28 de septiembre de 2009 a las 6:37

  • @ctn Eso es simplemente porque olvidé el -f (--force) opción. He editado la respuesta en consecuencia. Luego responda que su referencia usa esa misma opción.

    – VoC

    26 mayo 2015 a las 16:35

1646957172 718 Cambie un HEAD remoto de Git para que apunte a
jrhorn424

Actualizar: Esto solo funciona para la copia local del repositorio (el “cliente”). Por favor, vea los comentarios de los demás a continuación.

Con una versión reciente de git (febrero de 2014), el procedimiento correcto sería:

git remote set-head $REMOTE_NAME $BRANCH

Entonces, por ejemplo, cambiar la cabeza en el control remoto origin ramificar develop sería:

git remote set-head origin develop

  • ¿Esta característica necesita una versión reciente de git en el servidor o es suficiente si la máquina cliente tiene instalado git reciente?

    –Mikko Rantalainen

    6 de marzo de 2014 a las 9:48

  • @Totor es conciso pero correcto; esta respuesta debe ser rechazada. Git tiene este concepto un tanto confuso de una “rama local predeterminada para el control remoto”. Le permite escribir “origen” en lugar de “origen/rama predeterminada” y es un lado del cliente puro cosa. Larga historia en git-scm.com/docs/git-remote #set-head

    – Marzo

    18 dic 2016 a las 19:52


  • para confirmar de qué está hablando @MarchH: ejecutar git checkout -b default; git push origin HEAD; git remote set-head origin default. A continuación, puede inspeccionar los cambios locales con cat .git/refs/remotes/origin/HEAD (debería ser ref: refs/remotes/origin/default), y la falta de cambios remotos con git remote show origin (seguirá siendo lo que era antes de agregar la rama predeterminada).

    – De Novo

    3 de marzo de 2019 a las 23:42

Ya que mencionas a GitHub, para hacerlo en su sitio simplemente ingresa a tu proyecto, luego…

admin > Default Branch > (choose something)

Hecho.

  • ¡Excelente! Ese era el último bit que faltaba.

    – berkus

    20 de diciembre de 2012 a las 19:48

  • Mi origen/HEAD ya apunta a una rama de función en lugar de maestro. Intenté cambiar la “rama principal” de un lado a otro, pero no afectó al HEAD… ¿Alguna sugerencia?

    – Daniil Shevelev

    2 de enero de 2014 a las 16:43

  • Configuración > Sucursales > Sucursal predeterminada

    – Chun Yang

    22 de noviembre de 2015 a las 17:10


  • Cambiar la rama predeterminada en Gitlab/Github, NO cambia el remotes/origin/HEAD -> origin/master puntero

    – Paweł Załuski

    14 de diciembre de 2020 a las 0:35

Cambie un HEAD remoto de Git para que apunte a
mani-fresco

Ver: http://www.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html

Esto establece la rama predeterminada en el repositorio de git. Puede ejecutar esto en repositorios desnudos o reflejados.

Uso:

$ git symbolic-ref HEAD refs/heads/<branch name>

1646957173 324 Cambie un HEAD remoto de Git para que apunte a
imz — Ivan Zakharyaschev

(Básicamente, ya había la misma pregunta “crear una referencia simbólica de git en un repositorio remoto”, que no recibió una respuesta universal).

Pero hay respuestas específicas para varias “granjas” de git (donde varios usuarios pueden administrar repositorios de git a través de una interfaz restringida: a través de http y ssh): http://Github.com, http://Gitorious.org, http://repo.or.cz, girar (http://git.altlinux.org).

Estas respuestas específicas pueden ser útiles para quienes lean esta página y piensen en estos servicios específicos.

1646957173 153 Cambie un HEAD remoto de Git para que apunte a
enjugador de goma

Si tiene acceso al repositorio remoto desde un shell, simplemente ingrese a .git (o al directorio principal si es un repositorio simple) y cambie el archivo HEAD para que apunte al encabezado correcto. Por ejemplo, por defecto siempre contiene ‘refs: refs/heads/master’, pero si necesita que foo sea el HEAD, simplemente edite el archivo HEAD y cambie el contenido a ‘refs: refs/heads/foo’.

1646957173 676 Cambie un HEAD remoto de Git para que apunte a
kbro

Puede crear un separado Maestro branch usando solo comandos Git de porcelana:

git init
touch GO_AWAY
git add GO_AWAY
git commit -m "GO AWAY - this branch is detached from reality"

Eso nos da un Maestro rama con un mensaje grosero (es posible que desee ser más cortés). Ahora creamos nuestra rama “real” (llamémosla maletero en honor a SVN) y divorciarlo de Maestro:

git checkout -b trunk
git rm GO_AWAY
git commit --amend --allow-empty -m "initial commit on detached trunk"

¡Listo! gitk –todos Mostrará Maestro y maletero sin vínculo entre ellos.

La “magia” aquí es que –enmendar causas git cometer para crear una nueva confirmación con el mismo padre que el HEAD actual, luego haga que HEAD apunte a él. Pero el HEAD actual no tiene un padre, ya que es la confirmación inicial en el repositorio, por lo que el HEAD nuevo tampoco tiene uno, por lo que se separan entre sí.

El antiguo compromiso HEAD no se elimina por git-gc porque refs/heads/master todavía lo señala.

los –permitir-vacío la bandera solo es necesaria porque estamos confirmando un árbol vacío. si hubiera algunos añadires después de la git rm entonces no seria necesario.

En verdad, puede crear una rama separada en cualquier momento ramificando la confirmación inicial en el repositorio, eliminando su árbol, agregando su árbol separado y luego haciendo git commit –enmendar.

Sé que esto no responde a la pregunta de cómo modificar la rama predeterminada en el repositorio remoto, pero da una respuesta clara sobre cómo crear una rama separada.

  • Puede crear una rama separada más fácilmente obteniendo una rama no relacionada de otro repositorio y dándole un nombre. Por ejemplo, git fetch git:user@example.com:foo remote-branch-name && git checkout -b detached-branch FETCH_HEAD añadirá una nueva sucursal detached-branch que coincide con la rama remote-branch-name en remoto git:user@example.com:foo. Por supuesto, el “remoto” puede ser un repositorio en el sistema de archivos local que haya preparado previamente.

    –Mikko Rantalainen

    26 de marzo de 2013 a las 7:02


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad