Usando el carácter de barra diagonal en el nombre de la rama de Git
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?
¿ Estás seguro de que la rama labs
no 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 labs
no 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/subbranch
existe, 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.
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 branch
o git rev-parse --symbolic-full-name HEAD
?
Olvidé que ya tenía una labs
sucursal 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 labs
y un directorio labs
al mismo nivel.
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 features
y obtuve la excepción del autor de la pregunta.
Eliminar la rama features
resolvió el problema, el comando anterior funcionó.