Использование символа косой черты в имени ветки Git


222

Я почти уверен, что где-то в популярном Git-проекте я видел, что у веток был такой шаблон, как "feature / xyz".

Однако, когда я пытаюсь создать ветку с символом косой черты, я получаю сообщение об ошибке:

$ 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

Та же проблема для (моя первоначальная попытка):

$ git checkout -b labs/feature

Как создать ветку в Git с косой чертой?

git  branch 

1
На самом деле, похоже, у вас есть проблемы с вашим HEAD. Похоже, git думает, что вы HEAD- ссылка на ветку, labs/featureкоторая еще не была создана. Я понятия не имею, как это могло произойти, но это означает, что ваша попытка создать ветку с именем foo/barна ее основе не работает. Есть идеи, как вы HEADоткрепились?
— CB Bailey

Прошу прощения за путаницу, ее "labs / feature", а не "foo / bar", отредактированный пример.

FWIW что-нибудь перед косой чертой сгенерирует каталог, .git/refs/headsт.е. если вы это сделаете, git checkout -b feature/123то внутри вашего projectRootFolder/.git/refs/headsкаталога вы увидите каталог с именем: featureгде внутри этого каталога вы увидите ветку с именем 123. Позже, если вы создадите другой каталог feature/124внутри featureкаталога, вы увидите ветку с именем124
— Honey

:-D "На самом деле похоже, что у вас есть проблемы с вашим HEAD" Nice @CBBailey
— Кент Булл

Ответы:


222

Вы уверены, что ветвь labsеще не существует (как в этой теме )?

Вы не можете иметь как файл, так и каталог с одинаковым именем.

Вы пытаетесь заставить git сделать это:

% 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

Вы получаете эквивалент ошибки «невозможно создать каталог».
Когда у вас есть ветка с косой чертой, она сохраняется как иерархия каталогов в .git/refs/heads.


3
Спасибо за подробный ответ. Интересно я попробовал git branch foo / bar (который работал); затем git branch -d foo / bar, но я вижу, что каталог foo / (теперь пустой) все еще существует! РЕДАКТИРОВАТЬ: и он заменяется, как только я делаю "Git Branch Foo". Все хорошо.

1
@faB: злой ... но не неожиданно: вы удалили панель (в fooпространстве имен ' '), но не удалили foo(которая могла бы служить пространством имен для другой ветви или быть самой ветвью)
— VonC

Это на самом деле не имеет значения, но git не меняет свою позицию, даже когда вы звоните pack-refs, поэтому он пытается защитить вас от этого.
— Джош Ли

23
Резюмируя ответ: у вас может быть косая черта в названиях веток. У ОП уже была labsветка и попытался создать labs/feature, на которую глыбнул.
— duozmo

107

Возможно иметь иерархические имена ветвей (имена веток с косой чертой). Например, в моем репозитории у меня есть такая ветка (и). Единственное предостережение в том, что в репозитории нельзя использовать как ветку 'foo', так и ветку 'foo / bar'.

Ваша проблема не в создании ветки с косой чертой в имени.

$ git branch foo / bar
ошибка: не удается разрешить ссылки refs /heads / labs / feature: не каталог
Неустранимый: Не удалось заблокировать ссылку для обновления: Не каталог

Приведенное выше сообщение об ошибке говорит о ветке 'labs / feature', а не о 'foo / bar' (если только это не ошибка в copy'n'paste, т.е. вы редактировали части сессии). Каков результат git branchили git rev-parse --symbolic-full-name HEAD?


1
Спасибо, извините за путаницу, я сначала написал пример foo / bar, но вставил сообщение об ошибке из моего реального теста. Больше не буду :) И извините за мою ошибку, у меня уже была ветка "labs".

33

Иногда эта проблема возникает, если у вас уже есть ветка с базовым именем.

Я попробовал это:

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

К сожалению, у меня уже была названная ветка features, и я получил исключение из вопроса.

Удаление ветки featuresрешило проблему, вышеприведенная команда сработала.


32

В моем случае я забыл, что там уже была неиспользованная labsветка. Удаление это решило проблему:

git branch -d labs
git checkout -b labs/feature

Объяснение:

Каждое имя может быть только родительской ветвью или обычной ветвью, но не обоими. Вот почему ветви labs и labs/feature не могут существовать одновременно.

Причиной такого поведения является то, что ветви хранятся в файловой системе, и там вы также не можете иметь файл labsи каталог labsна одном уровне.


-1

Я могу ошибаться, но я подумал, что косые черты появляются только в именах веток, когда они связаны, например, с удаленным репо origin/master.


11
Вполне возможно - и действительно распространено - создавать локальные ветви с '/' в их именах. Это распространенный способ группировки связанных ветвей в «пространстве имен».
— CB Bailey

Да, если честно, это может сбивать с толку при обучении, но наименование может быть полезным. Тогда снова используя косую черту или тире, я не уверен, что это имеет значение вне личного вкуса?

2
Git Flow использует этот стиль пространства имен :)
— Rimian
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.