75

我有一组非常简单的 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/...分支都会发生这种情况。

4

3 回答 3

126

分支存储为目录中的文件.git。单个分支是包含分支指向的提交对象的散列的单个文件。

所以,你可能猜到了,当创建一个分支时,foo/bar这将对应于一个带有文件的目录。因此,Git 将创建一个文件夹foo,其中包含一个bar指向提交的文件。

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

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

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

于 2013-03-12T21:08:28.667 回答
18

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

很久以前,有人创建了两个远程文件夹,它们的区别仅在于第一个字母的大小写。大写的版本已被放弃;但我的回购,在那个时间之前,仍然有大写的拼写。

所以每次我尝试从新文件夹中拉取时,它都会起作用,但是git将本地分支放入本地大写文件夹中。症状是我无法对该分支进行新的更改。每次我都必须删除我的本地副本并再次检查远程。

我的解决方法是更改​​文件夹名称的拼写,.git/refs/remotes问题已经解决。

于 2018-02-01T15:20:37.923 回答
9

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

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

git config --global --get core.ignorecase

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

git config --global core.ignorecase false

这将禁用 git 中的忽略大小写。希望这能解决这个问题。确保您不是在处理多语言项目,在这种情况下,此设置可能需要 true。

于 2018-07-25T11:40:51.463 回答