Почему имя ветки не может содержать символ «пробел»?

Я пытался:

git branch "MyProj/bin/ ignored"

и получил:

fatal: 'MyProj/bin/ ignored' is not a valid branch name.

Страница руководства git-branch указывает на git-check-ref-format справочную страницу, чтобы получить фактические правила для допустимого имени ветки.

Разумеется, причиной вышеупомянутой фатальной ошибки, по-видимому, является включение символа пробела.

Есть идеи, почему в наши дни пробелы по-прежнему исключаются из имени ветки (я ожидал этого, например, в древней CVS, но Git?)

Какие могут быть веские технические причины для этого?


person WinWin    schedule 08.07.2011    source источник
comment
Для этого нет уважительных технических причин. Это что-то среднее между тем, что я слишком ленив, чтобы поддерживать это, и я твердо убежден по некоторым произвольным причинам, что пробелы никогда не должны быть частью имен веток.   -  person Roman Starkov    schedule 09.09.2013
comment
stackoverflow.com/ вопросы / 3651860 /   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 27.08.2016
comment
Ради здравого смысла, краткости, предсказуемости (и переносимости: для скриптов с регулярным выражением в именах веток) я только использую тире (-), строчные буквы ([a-z]) и числа ([0-9]) в именах веток. . Ни подчеркивания (_), ни прописных букв. Зачем усложнять его, чем необходимо? Я также никогда не использую косую черту (/), потому что это полезный признак того, что ветка является особенной. И в основном нет причин использовать / вместо -, кроме как для помощи тупым инструментам графического интерфейса, которые автоматически сворачивают их (например, дерево), что умный графический интерфейс может / должен так же легко сделать на тире -.   -  person michael    schedule 01.11.2016


Ответы (5)


Я не знаю, собираетесь ли вы найти в основе всего этого чисто техническую причину. Тем не менее, я могу предложить, что пробелы имеют тенденцию бросать ключи во всевозможные утилиты * nix и при обработке имен файлов, так что, возможно, это было сделано для того, чтобы случайно не сделать что-нибудь неправильно в дальнейшем. В конце концов, ветка git сводится к файлу в репо, и это позволяет избежать работы с пробелами в имени этого файла (в частности, ветка - это файл в .git / refs / Heads /, как упоминалось в комментарии).

В основном, я бы предположил, что причина философская и предназначена для простоты. Имена веток - это удобочитаемые имена, которые не имеют реальной причины быть сложными (и требуют ввода двух дополнительных символов каждый раз, ха-ха, чтобы вызвать призрак системного администратора, который присвоил каждой команде неразборчивую трехбуквенную комбинацию). Иначе известный как аргумент «почему cd не является chdir».

person shelhamer    schedule 08.07.2011
comment
Под капотом ветвь Git представляет собой простой файл в .git/refs/heads/, содержащий только SHA-1 фиксации, на которую он указывает. Как сказал @Shelhamer, пробелы в именах файлов в * nix довольно неудобны, поэтому Git просто обходит стороной. - person dunedain289; 08.07.2011

старый поток, но эй ..
на Mac я использую alt + пробел. он добавит невидимого персонажа, который поможет вам. разум: это не «космос», это невидимый персонаж. визуально то же самое, но фактически не то же самое. 100% вероятность запутает кого-то еще и определенно принесет хаос повсюду, но эй, для удовольствия ... почему бы и нет? xD

git checkout -b US24024 Automated Tests - Profile A
Switched to a new branch 'US24024 Automated Tests - Profile A'
person joe    schedule 16.12.2016
comment
Между прочим, было указано, что atlasian sourcetree в некоторых случаях не может прочитать ветку с именем 'space'. это очевидно, но используйте на свой страх и риск (или чтобы рассердить коллег). - person joe; 08.07.2017
comment
Для любопытных: alt + пробел = Unicode-символ 'NO-BREAK SPACE' (U + 00A0) - person Enselic; 25.09.2020

Есть возможное решение, если вы достаточно отчаянны. В наборе Unicode много пробелоподобных символов. Но только U + 0020 - это запрещенное пространство. Возьмите, например, неразрывный пробел, и вы можете иметь имя ветки с пробелами. Основная проблема заключается в том, что на вашей клавиатуре, скорее всего, нет клавиши для этой кодовой точки. Я использую следующий сценарий, чтобы обойти эту проблему:

#!/bin/zsh
git co -b "${@// / }"

Он просто заменяет все пробелы в аргументах неразрывными пробелами ...

person Vir    schedule 01.07.2015

Потому что правильно использовать имена путей в сценариях оболочки сложно. Из связанного _1 _ сама страница руководства:

Эти правила упрощают для инструментов на основе сценариев оболочки анализ имен ссылок, расширение имени пути оболочкой, когда имя ссылки используется без кавычек (по ошибке), а также позволяют избежать двусмысленности в определенных выражениях имен ссылок (см. Gitrevisions (7)):

См. Также Имена файлов и пути в оболочке: как это сделать правильно:

Основная проблема заключается в том, что сегодня большинство Unix-подобных позволяют именам файлов включать почти любые байты < / а>. Сюда входят символы новой строки, табуляции, escape-символ (включая управляющие последовательности, которые могут выполнять команды при отображении), другие управляющие символы, пробелы (где угодно!), Начальные тире (-), метасимволы оболочки и последовательности байтов, которые не являются допустимыми UTF- 8 струн.

...

Однако этот недостаток Unix-подобных ядер (допускающий опасные имена файлов) сочетается с дополнительными слабостями языка оболочки Bourne, что еще больше затрудняет правильную обработку имен файлов и путей в оболочке. Я считаю, что оболочка - разумный язык для коротких сценариев при правильном использовании, но чрезмерная разрешимость имен файлов превращает простые задачи в легко выполнимые и неправильные.

person kelvin    schedule 24.12.2018

Это не разрешено, потому что это усложнило бы функциональность команды «git checkout».

Пример: Предположим, у вас в настоящее время есть ветка с именем, хотя вы в настоящее время находитесь в мастере. Если бы вы запустили команду

(мастер): git checkout -b мое исправление

git не будет знать, хотите ли вы создать новую ветку с именем «мое исправление» или если вы хотите создать новую ветку с именем «мое», которая будет связана с вашим исходным «исправлением», а не с «основной» ветвью.

Источник: https://git-scm.com/docs/git-checkout (Git Документация)

person Catalin Popescu    schedule 26.07.2016
comment
за исключением того, что вы могли просто сделать git checkout -b "my fix" - person Verv; 02.11.2017