Usar el carácter de barra diagonal en el nombre de rama de Git

222

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".

Sin embargo, cuando intento crear una rama con el carácter de barra diagonal, aparece 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

Mismo problema para (mi intento inicial):

$ git checkout -b labs/feature

¿Cómo se crea una rama en Git con el carácter de barra diagonal?


fuente
1
En realidad parece que tienes problemas con tu HEAD. Parece que git piensa que HEADes un enlace a la rama labs/featureque no se ha creado. No tengo idea de cómo pudo haber sucedido esto, pero significa que su intento de crear una rama llamada a foo/barpartir de ella no está funcionando. ¿Alguna idea de cómo te HEADdespegaste?
CB Bailey
Lamento la confusión, su "laboratorio / función", no "foo / bar", ejemplo editado.
FWIW cualquier cosa antes de la barra generará un directorio debajo, .git/refs/headses decir, si lo hace git checkout -b feature/123, dentro de su projectRootFolder/.git/refs/headsdirectorio verá un directorio llamado: featuredonde dentro de ese directorio verá una rama llamada 123. Más tarde, si crea otro feature/124, dentro del featuredirectorio, verá una rama llamada124
Honey,
:-D "En realidad parece que tienes un problema con tu HEAD" Nice one @CBBailey
Kent Bull

Respuestas:

222

¿Estás seguro de que la rama labsaún no existe (como en este hilo )?

No puede tener tanto un archivo como un directorio con el mismo nombre.

Estás tratando de hacer que git haga básicamente esto:

% 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

Obtiene el equivalente del error "no se puede crear el directorio".
Cuando tiene una rama con barras, se almacena como una jerarquía de directorios debajo .git/refs/heads.

VonC
fuente
3
Gracias por la respuesta en profundidad. Interesantemente probé git branch foo / bar (que funcionó); luego git branch -d foo / bar, ¡pero veo que el directorio foo / (ahora vacío) todavía existe! EDITAR: y se reemplaza tan pronto como hago "git branch foo". Todo está bien.
1
@faB: malvado ... pero no inesperado: eliminó la barra (en el ' foo' espacio de nombres), pero no foo(que podría servir como un espacio de nombres para otra rama o ser una rama en sí)
VonC
Esto realmente no importa, pero git no cambia su postura incluso cuando llamas pack-refs, por lo que está haciendo todo lo posible para protegerte de esto.
Josh Lee
23
Para resumir la respuesta: puede tener barras en los nombres de las ramas. OP ya tenía una labsrama y trató de crear labs/feature, lo que git rechazó.
duozmo
107

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

Su problema no es crear una rama con una barra diagonal en el nombre.

$ git branch foo / bar
error: no se puede resolver referencias de referencia / heads / labs / feature: no es un directorio
fatal: no se pudo bloquear la referencia para la actualización: no es un directorio

El mensaje de error anterior se refiere a la rama 'labs / feature', no 'foo / bar' (a menos que sea un error en copiar y pegar, es decir, editó partes de la sesión). ¿Cuál es el resultado de git brancho git rev-parse --symbolic-full-name HEAD?

Jakub Narębski
fuente
1
Gracias, perdón por la confusión, primero escribí un ejemplo de foo / bar, pero pegué un 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".
33

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

Intenté esto:

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

Desafortunadamente, ya tenía una rama llamada features, y obtuve la excepción del que hacía la pregunta.

La eliminación de la rama featuresresolvió el problema, el comando anterior funcionó.

elbkind
fuente
32

En mi caso, olvidé que ya había una labsrama no utilizada . Eliminarlo resolvió el problema:

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

Explicación:

Cada nombre solo puede ser una rama principal o una rama normal, no ambas. Es por eso que las ramas labs y labs/feature no pueden existir ambas al mismo tiempo.

La razón de este comportamiento es que las ramas se almacenan en el sistema de archivos y allí tampoco puede tener un archivo labsy un directorio labsen el mismo nivel.

flori
fuente
-1

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

crazyscot
fuente
11
Es perfectamente posible, y de hecho común, crear sucursales locales con '/' en sus nombres. Es una forma común de agrupar ramas relacionadas en un 'espacio de nombres'.
CB Bailey
Sí, para ser honesto, eso puede ser confuso al aprender, pero la denominación también puede ser útil. Entonces, de nuevo, usando barra o guión, ¿no estoy seguro si importa más allá del gusto personal?
2
git flow utiliza este estilo de espacio de nombres :)
Rimian