为什么git将我的分支名称前缀大写?

时间:2013-03-12 20:50:41

标签: 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
  • 相关,为什么没有标记星号作为我当前的分支?

我在OS X 10.8.2上通过Homebrew使用git版本1.8.1.5,这种情况发生在有或没有我漂亮的驯服~/.gitconfig的情况下。对于看似每个bugfix/...分支都会发生这种情况。

3 个答案:

答案 0 :(得分:82)

分支在.git目录中存储为文件。单个分支是单个文件,包含分支指向的提交对象的哈希值。

因此,正如您可能猜到的,在创建分支foo/bar时,这将对应于具有文件的目录。所以Git会创建一个文件夹foo,文件bar然后指向提交。

这意味着当您添加另一个分支foo/baz时,它将创建一个文件baz并将其添加到该文件夹​​。

现在,对于不区分大小写的文件系统,分支名称不区分大小写。这意味着FOO/barfoo/bar是相同的。但实际的内部名称取自原始文件夹和文件名。因此,当bugfix分支类别的文件夹以大写形式书写时,分支将被大写BUGFIX识别。

要解决此问题,只需进入.git/refs/heads并将文件夹名称更改为您喜欢的方式。

答案 1 :(得分:6)

感谢您的回答,它帮助我找到了我的问题的解决方案,但我的有点不同。就我而言,大写名称的文件夹不在.git/refs/heads中,而在.git/refs/remotes中。

很久以前,有人创建了两个远程文件夹,这些文件夹的区别仅在于第一个字母的大小写。资本化版本已被放弃;但是我的回购,从那时起,仍然有大写字母。

因此,每次我尝试从新文件夹中提取时,它都可以工作,但是git会将本地分支放在本地的大写文件夹中。症状是我无法对该分支进行新的更改;我不得不删除我的本地副本,并且每次都要再次检查遥控器。

我的修复是更改.git/refs/remotes中文件夹名称的拼写,问题已解决。

答案 2 :(得分:1)

要解决此问题,您应该遵循@poke所说的,要禁用此功能,我使用了本地git命令,可以将忽略大小写切换为false。

要确定这一点,您可以通过运行以下命令来检查忽略大小写。

git config --global --get core.ignorecase

此命令将返回true,表明git正在忽略大小写。要解决此问题,请通过以下命令将其设置为false。

git config --global core.ignorecase false

这将禁用git中的ignorecase。希望这能解决此问题。确保您不在多语言项目上,在这种情况下,此设置可能要求为true。