Usando el carácter de barra diagonal en el nombre de la rama de Git

Resuelto asked hace 14 años • 8 respuestas

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

El 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?

 avatar Mar 27 '10 06:03
Aceptado

¿ Estás seguro de que la rama labsno existe (como en este hilo )?

No puede tener un archivo y un directorio con el mismo nombre.

Estás intentando 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

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


Tenga en cuenta que labsno debe ser una sucursal existente , como señala ddruganov en los comentarios :

 git switch -c 19023-commerce/19033-commerce-view 19023-commerce

 # Fails with:

 fatal: cannot lock ref 'refs/heads/19073-commerce-view/99999-test-branch': 
 'refs/heads/19073-commerce-view' exists; 
  cannot create 'refs/heads/19073-commerce-view/99999-test-branch'

Como se explica en " git push: refs/heads/my/subbranchexiste, no se puede crear ":

  • Si existe la rama b, no se puede crear ninguna rama llamada b/anything.
  • Del mismo modo, si existe la rama dev/b, no se puede crear dev/b/c.

Esta es una limitación interna de git.

VonC avatar Mar 26 '2010 23:03 VonC

Es posible tener nombres de sucursales jerárquicos (nombres de sucursales con barra diagonal). Por ejemplo, en mi repositorio tengo dichas sucursales. Una advertencia es que no puede tener ambas ramas 'foo' y 'foo/bar' en el repositorio.

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

$ git rama foo/bar
error: no se pueden 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 habla de la rama 'labs/feature', no de 'foo/bar' (a menos que sea un error al copiar y pegar, es decir, que haya editado partes de la sesión). ¿Cuál es el resultado de git brancho git rev-parse --symbolic-full-name HEAD?

Jakub Narębski avatar Mar 26 '2010 23:03 Jakub Narębski

Olvidé que ya tenía una labssucursal sin usar. Eliminarlo resolvió mi 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 ambas. Es por eso que las ramas labs y labs/feature no pueden existir al mismo tiempo.

La razón: las ramas se almacenan en el sistema de archivos y allí tampoco se puede tener un archivo labsy un directorio labsal mismo nivel.

flori avatar Feb 04 '2016 07:02 flori

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

Probé esto:

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

Desafortunadamente, ya tenía una rama llamada featuresy obtuve la excepción del autor de la pregunta.

Eliminar la rama featuresresolvió el problema, el comando anterior funcionó.

elbkind avatar Mar 20 '2013 15:03 elbkind