Utilisation du caractère barre oblique dans le nom de la branche Git

222

Je suis presque sûr d'avoir vu quelque part dans un projet Git populaire les branches avaient un motif comme "feature / xyz".

Cependant, lorsque j'essaie de créer une branche avec le caractère barre oblique, 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 première tentative):

$ git checkout -b labs/feature

Comment créer une branche dans Git avec le caractère barre oblique?


la source
1
En fait, il semble que vous ayez des problèmes avec votre HEAD. Il semble que git pense que vous êtes HEADun lien vers la branche labs/featurequi n'a pas été créée. Je ne sais pas comment cela a pu se produire, mais cela signifie que votre tentative de créer une branche appelée en foo/barfonction de cela, ne fonctionne pas. Une idée de comment tu HEADes décollé?
CB Bailey
Je suis désolé pour la confusion, ses "labs / feature", pas "foo / bar", exemple édité.
FWIW n'importe quoi avant la barre oblique générera un répertoire sous .git/refs/headsie si vous le faites git checkout -b feature/123alors à l'intérieur de votre projectRootFolder/.git/refs/headsrépertoire, vous verrez un répertoire nommé: featureoù à l'intérieur de ce répertoire, vous verrez une branche nommée 123. Plus tard, si vous en créez un autre feature/124à l'intérieur du featurerépertoire, vous verrez une branche nommée124
Honey
:-D "En fait, il semble que vous ayez un problème avec votre HEAD" Nice one @CBBailey
Kent Bull

Réponses:

222

Êtes-vous sûr que la branche labsn'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 en sorte que git fasse 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 avec des barres obliques, elle est stockée en tant que hiérarchie de répertoires sous .git/refs/heads.

VonC
la source
3
Merci pour la réponse en profondeur .. Intéressant, j'ai essayé git branch foo / bar (qui a fonctionné); puis git branch -d foo / bar, mais je vois que le répertoire foo / (maintenant vide) existe toujours! EDIT: et il est remplacé dès que je fais "git branch foo". Tout est bien.
1
@faB: méchant ... mais pas inattendu: vous avez supprimé la barre (dans l' fooespace de noms ' '), mais pas foo(qui pourrait servir d'espace de noms pour une autre branche ou être une branche elle-même)
VonC
Cela n'a pas vraiment d'importance, mais git ne change pas sa position même lorsque vous appelez pack-refs, donc il se met en quatre pour vous protéger de cela.
Josh Lee
23
Pour résumer la réponse: vous pouvez avoir des barres obliques dans les noms de branche. OP avait déjà une labsbranche et a essayé de créer labs/feature, ce qui a reculé.
duozmo
107

Il est possible d'avoir des noms de branche hiérarchiques (noms de branche avec barre oblique). Par exemple, dans mon référentiel, j'ai de telles branches. Une mise en garde 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 une barre oblique dans le nom.

$ git branch foo / bar
erreur: impossible de résoudre les références / têtes / laboratoires / fonctionnalité de référence: pas un répertoire
fatal: impossible de verrouiller la référence pour la mise à jour: pas un répertoire

Le message d'erreur ci-dessus parle de la branche 'labs / feature', pas 'foo / bar' (sauf si c'est une erreur de copier-coller, c'est-à-dire que vous avez édité des parties de session). Quel est le résultat de git branchou git rev-parse --symbolic-full-name HEAD?

Jakub Narębski
la source
1
Merci, désolé pour la confusion, j'ai d'abord écrit un exemple foo / bar, mais collez le message d'erreur de mon test actuel. Je ne le referai pas :) Et désolé aussi pour mon erreur, en effet j'avais déjà une branche "labs".
33

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 poseur de questions.

La suppression de la branche a featuresrésolu le problème, la commande ci-dessus a fonctionné.

elbkind
la source
32

Dans mon cas, j'ai oublié qu'il y avait déjà une labsbranche inutilisée . La 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 parente ou une branche normale, pas les deux. C'est pourquoi les branches labs et labs/feature ne peuvent pas exister à la fois en même temps.

La raison de ce comportement est que les branches sont stockées dans le système de fichiers et que vous ne pouvez pas non plus avoir un fichier labset un répertoire labsau même niveau.

flori
la source
-1

Je peux me tromper, mais je pensais que les barres obliques n'apparaissaient dans les noms de branche que lorsqu'elles concernaient un dépôt à distance, par exemple origin/master.

crazyscot
la source
11
Il est parfaitement possible - et même courant - de créer des branches locales avec «/» dans leurs noms. C'est une façon courante de regrouper les branches liées dans un «espace de noms».
CB Bailey
Oui, pour être honnête, cela peut être déroutant lors de l'apprentissage, mais la dénomination peut également être utile. Ensuite, en utilisant une barre oblique ou un tiret, je ne sais pas si cela compte au-delà des goûts personnels?
2
git flow utilise ce style d'espaces de noms :)
Rimian