Подтвердить что ты не робот

Почему 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/....

4b9b3361

Ответ 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, и проблема была решена.