Почему git используется для префикса имени моей ветки?
У меня есть очень простой набор команд git, что приводит к некоторому любопытным поведением:
Покажите текущие локальные ветки и посмотрите, что я нахожусь на release/beta1
:
$ git branch
develop
master
* release/beta1
Создайте ветку bugfix/somefeature
от release/beta1
:
$ git checkout -b bugfix/somefeature
Switched to a new branch 'bugfix/somefeature'
До сих пор так хорошо, правда? Ну, покажи мне локальные ветки:
$ git branch
BUGFIX/somefeature
Вопросы:
- Почему префикс
bugfix
моей ветки получил заглавные буквы как bugfix
?
- Связано, почему это не отмечено звездочкой как моя текущая ветка?
Я использую git версию 1.8.1.5 через Homebrew в OS X 10.8.2, и это происходит с или без моего довольно ручного ~/.gitconfig
на месте. Это происходит, по-видимому, для каждой ветки bugfix/...
.
Ответы
Ответ 1
Ветви хранятся в виде файлов в каталоге .git
. Единственная ветвь - это один файл, содержащий хэш, для объекта фиксации, на который указывает ветка.
Итак, как вы, возможно, догадались, при создании ветки foo/bar
это будет соответствовать каталогу с файлом. Таким образом, Git создаст папку foo
с файлом bar
, который затем укажет на фиксацию.
Это означает, что при добавлении другой ветки foo/baz
она создаст файл baz
и добавит его в папку.
Теперь имена ветвей нечувствительны к регистру для нечувствительных к регистру файловых систем. Это означает, что foo/bar
и foo/bar
совпадают. Но фактическое внутреннее имя берется из исходной папки и имени файла. Поэтому, когда папка для вашей категории ветвей bugfix
написана в верхнем регистре, ветки распознаются в верхнем регистре bugfix
.
Чтобы исправить это, просто зайдите в .git/refs/heads
и измените имя папки так, как вам нравится.
Ответ 2
Спасибо за ответ, он помог мне найти решение моей проблемы, но моя была немного иной. В моем случае папка с заглавным именем не была в .git/refs/heads
, но в .git/refs/remotes
.
Некоторое время назад кто-то создал две удаленные папки, которые отличались только капитализацией первой буквы. Заглавная версия была оставлена; но мое репо, существовавшее до этого времени, все еще имело капитализированное написание.
Поэтому каждый раз, когда я пытался вытащить из новой папки, он работал бы, но git локально вставлял локальную ветвь в заглавную папку. Симптом состоял в том, что я не мог вносить новые изменения в эту ветку; Мне пришлось удалить локальную копию и снова проверить удаленный выход.
Мое исправление заключалось в изменении написания имени папки в .git/refs/remotes
, и проблема была решена.