2013-03-12 89 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通过在OS X 10.8.2自制,并且出现这种情况有或没有我漂亮温顺~/.gitconfig到位。这似乎每bugfix/...分支发生。

+0

ls -lR在你的.git目录中可能会有一些亮点。 – bmargulies 2013-03-12 21:08:02

+0

另请参阅:http://stackoverflow.com/questions/13828066/how-do-i-solve-a-folder-capitalization-conflict-with-git-on-windows – meawoppl 2014-02-25 23:08:14

回答

65

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

所以,正如你猜测的那样,当创建一个分支foo/bar时,这将对应一个带有文件的目录。因此,Git将创建一个文件夹foo,文件bar然后指向提交。

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

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

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

+3

分支名称是**不是**不区分大小写由其性质决定。只有在将文件作为文件存储在不区分大小写的文件系统上时才会发生,如OS X中默认使用的那样。分支不一定存储为文件;它们也可以存储在'.git/packed-refs'文件中,虽然这是不寻常的,对于新创建的分支来说当然不是这种情况。 – qqx 2013-03-12 21:16:34

+0

@qqx好点! – poke 2013-03-12 21:23:31

+0

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

1

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

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

因此,每次我试图从新文件夹拉,它会工作,但git将本地分支本地放入大写文件夹。症状是我无法对该分支进行新的更改;我必须删除我的本地副本,并且每次都要再次检查遥控器。

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

相关问题