web-dev-qa-db-fra.com

Utilisation de la barre oblique dans le nom de la branche Git

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?

191
user58777

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

203
VonC

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?

96
Jakub Narębski

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

27
elbkind

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 labsetlabs/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.

24
flori