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

Col*_*len 50 git

我有一个非常简单的git命令集导致一些奇怪的行为:

显示我当前的本地分支,看看我在release/beta1:

$ git branch
  develop
  master
* release/beta1
Run Code Online (Sandbox Code Playgroud)

bugfix/somefeaturerelease/beta1以下位置创建分支:

$ git checkout -b bugfix/somefeature
Switched to a new branch 'bugfix/somefeature'
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都那么好吧?那么,再次向我展示当地分行:

$ git branch
  BUGFIX/somefeature
Run Code Online (Sandbox Code Playgroud)

问题:

  • 为什么bugfix我的分支的前缀被大写为BUGFIX
  • 相关的,为什么没有标记星号作为我当前的分支?

我在OS X 10.8.2上通过Homebrew使用git版本1.8.1.5,这种情况发生在有或没有我相当温顺~/.gitconfig的地方.对于看似每个bugfix/...分支都会发生这种情况.

pok*_*oke 89

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

因此,正如您可能猜到的,在创建分支时,foo/bar这将对应于具有文件的目录.因此Git将创建一个文件夹foo,bar其中包含一个指向提交的文件.

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

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

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

  • 根据其性质,分支名称不是**不区分大小写.仅当在不区分大小写的文件系统上存储为文件时才会发生这种情况,如OS X中默认使用的那样.并且分支不一定存储为文件; 它们也可以存储在`.git/packed-refs`文件中,尽管这不常见,对于新创建的分支肯定不会这样. (4认同)
  • DANGERRRRR !!!!! 这可能会导致一些严重的问题!例如,如果您在推送copitolization时执行git checkout mastER将反映在存储库(是一个奇怪的分支)而不是本地.这可能会导致非常糟糕的事情_ (2认同)

Abh*_*ble 8

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

要识别这一点,您可以通过运行以下命令来检查 ignorecase。

git config --global --get core.ignorecase
Run Code Online (Sandbox Code Playgroud)

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

git config --global core.ignorecase false
Run Code Online (Sandbox Code Playgroud)

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


drd*_*cox 7

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

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

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

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