Використання косого символу у назві гілки Git


222

Я впевнений, що десь у популярному проекті Git я бачив гілки, як "особливість / 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

Вибачте за плутанину, її "лабораторії / функції", а не "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 гілка -d foo / bar, але я бачу, що foo / каталог (тепер порожній) все ще існує! EDIT: і його замінюють, як тільки я роблю "git branch foo". Все добре.

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

Це насправді не має значення, але git не змінює свою позицію навіть під час дзвінка pack-refs, тож він перешкоджає захистити вас від цього.
Джош Лі

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

107

Можна мати ієрархічні назви гілок (назви гілок з косою рисою). Наприклад, у моєму сховищі у мене є такі гілки. Одним із застережень є те, що у сховищі не може бути як гілка 'foo', так і гілка 'foo / bar'.

Ваша проблема не у створенні гілки з косою косою назвою.

$ git гілка foo / бар
помилка: не вдається вирішити довідкові реф / голови / лабораторії / функція: Не каталог
fatal: Не вдалося заблокувати посилання для оновлення: Не каталог

Вищезгадане повідомлення про помилку говорить про гілку "лабораторії / функції", а не "foo / bar" (якщо це не помилка в copy'n'paste, тобто ви редагували частини сеансу). Що є результатом git branchабо git rev-parse --symbolic-full-name HEAD?


1
Дякую, вибачте за плутанину, спершу я написав приклад foo / bar, але вставте повідомлення про помилку з мого фактичного тесту. Не зроблю це знову :) І вибачте також за свою помилку, адже я вже мав відділення "лабораторії".

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 використовує цей стиль простору імен :)
Ріміан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.