2010-03-26 17 views
155

Estoy bastante seguro de que vi en algún lugar de un proyecto popular de Git que las ramas tenían un patrón como "feature/xyz".Usando el carácter barra en el nombre de la rama Git

Sin embargo, cuando intento crear una rama con el carácter de barra, me sale un error:

$ git branch labs/feature 
error: unable to resolve reference refs/heads/labs/feature: Not a directory 
fatal: Failed to lock ref for update: Not a directory 

El mismo problema para (mi primer intento):

$ git checkout -b labs/feature 

¿Cómo se crea una rama en Git con el personaje barra?

+0

En realidad parece que tienes problemas con tu 'HEAD'.Parece que git piensa que tu 'HEAD' es un enlace a la rama' labs/feature' que no se ha creado. No tengo idea de cómo pudo haber sucedido esto, pero significa que su intento de crear una rama llamada 'foo/bar' basada en él, no está funcionando. ¿Alguna idea de cómo tu 'HEAD' se despegó? –

+0

Disculpe la confusión, es un ejemplo editado de "labs/feature", no "foo/bar". –

Respuesta

175

¿Está seguro de que la rama labs todavía no existe (como en this thread)?

You can't have both a file, and a directory with the same name.

You're trying to get git to do basically this:

% cd .git/refs/heads 
% ls -l 
total 0 
-rw-rw-r-- 1 jhe jhe 41 2009-11-14 23:51 labs 
-rw-rw-r-- 1 jhe jhe 41 2009-11-14 23:51 master 
% mkdir labs 
mkdir: cannot create directory 'labs': File exists 

You're getting the equivalent of the "cannot create directory" error.
When you have a branch with slashes in it, it gets stored as a directory hierarchy under .git/refs/heads .

+3

Gracias por la respuesta en profundidad ... Interstingly probé git branch foo/bar (que funcionó); luego git branch -d foo/bar, ¡pero veo que el directorio foo/(ahora vacío) aún existe! EDITAR: y se reemplaza tan pronto como hago "git branch foo". Todo está bien. –

+0

@faB: malvado ... pero no inesperado: eliminaste la barra (en el espacio de nombres 'foo''), pero no 'foo' (que podría servir como un espacio de nombres para otra rama o ser una rama en sí) – VonC

+0

Esto no Realmente importa, pero git no cambia su postura incluso cuando llamas a 'pack-refs', por lo que está saliendo de su camino para protegerte de esto. –

-2

Podría estar equivocado, pero pensé que las barras solo aparecían en los nombres de las sucursales cuando se relacionaban con un repositorio remoto, por ejemplo origin/master.

+9

Es perfectamente posible, y de hecho común, crear ramas locales con '/' en sus nombres. Es una forma común de agrupar ramas relacionadas en un 'espacio de nombres'. –

+0

Sí, para ser sincero, puede ser confuso cuando se aprende, pero el nombre también puede ser útil. Entonces, de nuevo, con barras o guiones, no estoy seguro de si importa más allá del gusto personal. –

+1

git flow usa este estilo de namespacing :) – Rimian

84

Es posible tener nombres de ramas jerárquicas (nombres de ramas con barra inclinada). Por ejemplo, en mi repositorio tengo tales ramas. Una advertencia es que no se puede tener tanto la rama 'foo' como la rama 'foo/bar' en el repositorio.

Su problema no está en crear una bifurcación con una barra en el nombre.

 
$ git branch foo/bar 
error: unable to resolve reference refs/heads/labs/feature: Not a directory 
fatal: Failed to lock ref for update: Not a directory 

El mensaje de error anterior habla de 'laboratorios/función de' rama, no 'foo/bar' (a menos que sea un error en Copy'n'Paste, es decir usted partes editadas de sesión). ¿Cuál es el resultado de git branch o git rev-parse --symbolic-full-name HEAD?

+1

Gracias, perdón por la confusión, primero escribí un ejemplo de foo/bar, pero pegar el mensaje de error de mi prueba real. No lo volveré a hacer :) Y lo siento también por mi error, de hecho ya tenía una rama de "laboratorios". –

21

A veces ese problema ocurre si ya tiene una rama con el nombre base.

He intentado esto:

git checkout -b features/aName origin/features/aName 

Por desgracia, ya tenía una rama llamada features, y me dio la excepción del autor de la pregunta que se trate.

Al eliminar la rama features resolvió el problema, el comando anterior funcionó.

15

En mi caso, olvidé que ya había una rama labs sin usar. Eliminación de los que resuelve el problema:

git branch -d labs 
git checkout -b labs/feature 

Explicación:

Cada nombre sólo puede ser una rama principal o una rama normal, no tanto. Es por eso que las ramas labsylabs/feature no pueden existir al mismo tiempo.

El motivo de este comportamiento es que las ramas se almacenan en el sistema de archivos y allí tampoco puede tener un archivo labs y un directorio labs en el mismo nivel.

Cuestiones relacionadas