2010-07-21 8 views
161

Tengo un repositorio vacío que se usa como almacén central para mi proyecto. Todos los desarrolladores hacen git clone <repo> para compartir con él. Cuando hacen el clon, obtienen un checkout de la rama maestra (a menos que lo hagan git clone -n) porque repo.git/HEAD contiene , lo que lo convierte en la rama Active Branch.Git: ¿forma correcta de cambiar Active Branch en un repositorio simple?

La pregunta es, ¿cómo puedo cambiar Active Branch correctamente? Podría simplemente piratear el archivo repo.git/HEAD directamente, pero eso parece desagradable y, bueno, hacky.

Intenté hacer git checkout <otherbranch> en el directorio repo .git, pero eso falló porque no estaba en un árbol de trabajo.

me trataron git update-ref HEAD refs/heads/otherbranch pero que acaba de actualizar refs/heads/master a ser el mismo que refs/heads/otherbranch (bueno, hice que uno en un repositorio ficticia, no es mi producción de uno!)

me trataron git update-ref --no-deref HEAD refs/heads/otherbranch y eso casi funcionó. Se actualizó el archivo HEAD, pero lo configuró en SHA1 de la confirmación señalada por refs/heads/otherbranch.

Estoy probando con la versión 1.7.0.2.msysgit.0 de git.

supongo que no hay manera de hacer esto a través git push, como permitir que todos y cada uno a su rama por defecto parece un poco inseguro (!), Pero seguro que hay una mejor manera de hacerlo en el directorio de recompra .git de piratear directamente el archivo HEAD.

+0

IMO simplemente está tratando fundamentalmente de hacer lo incorrecto aquí. Si desea que la rama predeterminada sea algo distinto a la maestra, entonces esa rama debe ser la maestra. Alternativamente, use dos repositorios diferentes. –

+10

¿De qué manera esto intenta fundamentalmente hacer algo incorrecto aquí? Un repositorio simple admite múltiples ramas. Utilizo un repositorio simple como respaldo de mi repositorio local, y como tal reflejo las ramas. Tengo un maestro en ambos y una rama de desarrollo en ambos. Si quiero ver el registro de la rama de desarrollo en el repositorio desnudo, tengo que hackear los archivos, parece que git es fundamentalmente incorrecto aquí con respecto al soporte de repositorio simple. – Cthutu

+11

@NicholasKnight En mi humilde opinión, estás fundamentalmente equivocado aquí. No hay nada especial acerca de "maestro" como nombre de una rama, es solo un valor predeterminado. En los respositorios que mantienen, no tenemos una rama principal, ya que "maestro" no es significativo para la empresa. Cada vez que hacemos un lanzamiento, creamos una nueva rama de mantenimiento con el nuevo número de versión y la asignamos como la rama activa. – Spacemoose

Respuesta

235

Si tiene acceso al repositorio desnudo remoto, este article suggests:

git symbolic-ref HEAD refs/heads/mybranch 

que actualizará el archivo de HEAD en el repositorio para que contenga:

ref: refs/heads/mybranch 

como documentado en el git-symbolic-ref


Si no tiene acceso al repositorio remoto, consulte my previous answer.


Recuerde que un comando como git remote set-head:

  • no cambia la rama por defecto del control remoto repo .
    Sólo cambia una rama seguimiento remoto almacena en su local de repo como refs/remotes/<name>/HEAD

  • no cambia HEAD en sí (de nuevo, sólo refs/remotes/<name>/HEAD), de ahí la necesidad de git symbolic-ref.

Así git remote set-headno es la respuesta aquí.
git symbolic-ref HEAD es, si tiene acceso directo al repositorio remoto.

+3

¡Gracias! Tengo acceso directo al repositorio remoto remoto, así que git-symbolic-ref hará el trabajo. Sin embargo, me gusta el truco de ancestro no común mencionado en el otro hilo, definitivamente uno para el último cajón. Pasé años buscando en Google esto, pero no pude encontrar su respuesta anterior, sin embargo, "git remote head master" lo encuentra como el segundo hit mejor clasificado, justo debajo de git-remote (1). Extraño. Solo muestra lo difícil que es encontrar algo cuando no sabes exactamente lo que estás buscando. – kbro

+0

'git symbolic-ref HEAD refs/heads/mybranch' funcionó muy bien para mí! ¡GRACIAS! ;) – vinzenzweber

+1

Realmente aprecio esta pregunta, porque accidentalmente revisé una * rama * diferente de la maestra y ahora tenía que arreglar eso. –

-4

que comparó dos directorios antes y después de aplicar

git symbolic-ref HEAD refs/heads/mybranch

y parece que sólo archivo repo.git/HEAD fue cambiado por lo que probablemente es bastante seguro sólo para "cortar" el archivo.

+2

Existen pequeños problemas de interrupción que pueden introducirse editando directamente los archivos de referencia de Git. Recomiendo mucho contra eso. Los comandos de fontanería son más fáciles y seguros que la edición directa de refs. –

+2

¿Cuál es la ventaja de este @boryn? –

+2

Git realiza un seguimiento de un montón de cosas en el fondo como un historial de referencias. Si cambia manualmente el archivo, no se registrará. Es verdad que probablemente no importará. Pero si pierde la pista de algunos commits y desea encontrarlos, será más feliz si no solo "piratea" el archivo. – qwerty9967

0

Además, si usted no tiene acceso al repositorio desnuda, haciendo un git remote set-head y ya está

Ver este anterior response

-3

También tienen un acuerdo de recompra al descubierto en nuestro servidor y fue capaz para recuperar archivos con éxito utilizando

git clone //server/repo/directory -b branch_name 

en un nuevo repositorio local a pesar de que la página de manual dice que esto es sólo para los repositorios no desnudos.

+1

Si bien lo que dices es cierto, el hecho de que estés usando -b para seleccionar una rama en particular rompe tu respuesta en el contexto de mi pregunta, que es cómo configuras la rama DEFAULT. – kbro

0

Para cambiar la rama, necesita cambiar la referencia HEAD a la rama que desea usar.

primera lista de todas las referencias en el repositorio desnudo por hacer

$find ref 

A continuación, busque la referencia para su rama, el formato será el siguiente refs/heads/<my_branch>. Así que el siguiente paso es comprobar de referencia actual, basta con escribir:

$git symbolic-ref HEAD 

por lo que saben que es la rama actual a continuación, actualizar según sea necesario.

$git sumbolic-ref HEAD ref/heads/<my_branch> 

Thant's it. Disfrutar.