2013-03-12 2 views
36

У меня есть очень простой набор команд 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/....

+0

ls -lR в вашем каталоге .git может пролить некоторый свет. – bmargulies

+0

См. Также: http://stackoverflow.com/questions/13828066/how-do-i-solve-a-folder-capitalization-conflict-with-git-on-windows – meawoppl

ответ

65

Филиалы хранятся в виде файлов в каталоге .git. Единственная ветвь - это один файл, содержащий хэш, для объекта фиксации, на который указывает ветка.

Итак, как вы, возможно, догадались, при создании ветки foo/bar это будет соответствовать каталогу с файлом. Итак, Git создаст папку foo с файлом bar, который затем указывает на фиксацию.

Это означает, что при добавлении другой ветки foo/baz он создаст файл baz и добавит его в папку.

Теперь имена ветвей нечувствительны к регистру для файловых систем, не учитывающих регистр. Это означает, что FOO/bar и foo/bar одинаковы. Но фактическое внутреннее имя взято из оригинальной папки и файла имени. Поэтому, когда папка для вашей категории филиалов bugfix написана в верхнем регистре, то ветви распознаются в верхнем регистре BUGFIX.

Чтобы исправить это, просто зайдите в .git/refs/heads и измените имя папки так, как вам нравится.

+3

Названия филиалов ** не ** нечувствительны к регистру по их характеру. Это происходит только при сохранении в виде файлов в файловой системе без учета регистра, как используется по умолчанию в OS X. И ветви не обязательно сохраняются в виде файла; они также могут храниться в файле '.git/упакованный-refs', хотя это было бы необычно и, конечно же, не было бы для вновь созданного филиала. – qqx

+0

@qqx Хорошие баллы! – poke

+0

hmpf, interesting ... – 2013-03-12 21:26:57

1

Спасибо за ответ, это помогло мне найти решение моей проблемы, но мое было немного иначе. В моем случае папка с заглавным именем не была в .git/refs/heads, но в .git/refs/remotes.

Некоторое время назад кто-то создал две удаленные папки, которые отличались только капитализацией первой буквы. Заглавная версия была оставлена; но мое репо, существовавшее до этого времени, все еще имело капитализированное правописание.

Так что каждый раз, когда я пытался вытащить из новой папки, он работал бы, но git помещал локальную ветвь в заглавную папку локально.Симптом состоял в том, что я не мог вносить новые изменения в эту ветку; Мне пришлось удалить локальную копию и снова проверить удаленный выход.

Мое решение заключалось в изменении орфографии имени папки в .git/refs/remotes, и проблема была решена.

Смежные вопросы