Использование символа косой черты в имени ветки 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.