Je suis sûr que j'ai vu quelque part dans un projet Git populaire que les branches avaient un motif comme "feature/xyz".
Cependant, lorsque j'essaie de créer une branche avec le caractère slash, j'obtiens une erreur:
$ 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
Même problème pour (ma tentative initiale):
$ git checkout -b labs/feature
Comment créer une branche dans Git avec le caractère slash?
Êtes-vous sûr que la branche labs
n'existe pas déjà (comme dans ce fil )?
Vous ne pouvez pas avoir à la fois un fichier et un répertoire du même nom.
Vous essayez de faire git pour faire essentiellement ceci:
% 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
Vous obtenez l'équivalent de l'erreur "impossible de créer un répertoire".
Lorsque vous avez une branche contenant des barres obliques, elle est stockée sous forme de hiérarchie de répertoires sous.git/refs/heads
.
Il est possible d'avoir des noms de branches hiérarchiques (noms de branches avec une barre oblique). Par exemple, dans mon référentiel, j'ai de telles branches. Un inconvénient est que vous ne pouvez pas avoir à la fois la branche 'foo' et la branche 'foo/bar' dans le référentiel.
Votre problème n’est pas de créer une branche avec un nom de barre oblique.
$ git branch foo/bar erreur: impossible de résoudre les références/têtes/labs/fonctionnalité de référence: pas un répertoire fatal: impossible de verrouiller le ref pour la mise à jour: pas un répertoire
Le message d'erreur ci-dessus parle de la branche "labs/feature" et non de "foo/bar" (sauf erreur dans la copie et le collage, c'est-à-dire que vous avez édité des parties de la session). Quel est le résultat de git branch
ou git rev-parse --symbolic-full-name HEAD
?
Parfois, ce problème se produit si vous avez déjà une branche avec le nom de base.
J'ai essayé ceci:
git checkout -b features/aName Origin/features/aName
Malheureusement, j'avais déjà une branche nommée features
et j'ai eu l'exception du demandeur.
La suppression de la branche features
a résolu le problème, la commande ci-dessus a fonctionné.
Dans mon cas, j'ai oublié qu'il y avait déjà une branche inutilisée labs
. Le supprimer a résolu le problème:
git branch -d labs
git checkout -b labs/feature
Explication:
Chaque nom ne peut être qu'une branche parent o une branche normale, pas les deux. Voilà pourquoi les branches labs
etlabs/feature
_ ne peut pas exister les deux à la fois.
La raison de ce comportement est que les branches sont stockées dans le système de fichiers et qu’il est également impossible d’avoir un fichier labs
et un répertoire labs
au même niveau.