如何在Git中提交仅区分大小写的文件名更改?

如何在Git中提交仅区分大小写的文件名更改?,git,case-sensitive,git-commit,git-config,Git,Case Sensitive,Git Commit,Git Config,我通过将第一个字母大写改为name.jpg来更改一些文件名,如name.jpg。Git无法识别这些更改,我不得不删除这些文件并再次上传。在检查文件名的更改时,Git是否有一种区分大小写的方法?我没有对文件本身做任何更改 Git有一个配置设置,告诉它是需要区分大小写还是不区分大小写的文件系统:core.ignorecase。要让Git区分大小写,只需将此设置设置为false。(如果您已经推送了文件,请小心,然后在给出其他答案的情况下,您应该首先移动它们) 请注意,在不区分大小写的文件系统上,将此选

我通过将第一个字母大写改为
name.jpg
来更改一些文件名,如
name.jpg
。Git无法识别这些更改,我不得不删除这些文件并再次上传。在检查文件名的更改时,Git是否有一种区分大小写的方法?我没有对文件本身做任何更改

Git有一个配置设置,告诉它是需要区分大小写还是不区分大小写的文件系统:
core.ignorecase
。要让Git区分大小写,只需将此设置设置为
false
。(如果您已经推送了文件,请小心,然后在给出其他答案的情况下,您应该首先移动它们)

请注意,在不区分大小写的文件系统上,将此选项设置为false通常不是一个好主意。这样做会导致奇怪的错误。例如,以仅更改字母大小写的方式重命名文件将导致git报告虚假冲突或创建重复文件(来自Mark Amery的注释)

文档 从:

core.ignorecase

如果为true,该选项将启用各种变通方法,使git能够更好地在不区分大小写的文件系统(如FAT)上工作。例如,如果一个目录列表在git需要
makefile
时发现
makefile
,git将假定它实际上是同一个文件,并继续将其作为
makefile
来记住

默认值为false,除非或将在创建存储库时探测并设置
core.ignorecase
true(如果适用)

不区分大小写的文件系统 据我所知,有两种最流行的操作系统具有不区分大小写的文件系统

  • 窗户
  • OSX

    • 这就是我在OS X上所做的:

      git mv File file.tmp
      git mv file.tmp file
      

      两个步骤,否则我会得到一个“文件存在”错误。也许可以通过添加
      --cached
      或诸如此类的方法一步完成。

      只要您只是重命名一个文件而不是文件夹,就可以使用:


      (从Git 2.0.1开始,上面咒语中的
      -f
      标志是多余的,但在较旧的Git版本中需要它。)

      在OSX下,为了避免这个问题和在不区分大小写的文件系统上开发时遇到的其他问题,可以使用Disk Utility创建区分大小写的虚拟驱动器/Disk image

      运行disk utility,创建新的磁盘映像,并使用以下设置(或根据需要进行更改,但保持区分大小写):

      确保告诉git它现在在区分大小写的FS上:

      git config core.ignorecase false
      

      我在MacOS上多次遇到过这个问题。Git是区分大小写的,但Mac是唯一保留大小写的

      有人提交了一个文件:
      Foobar.java
      ,几天后决定将其重命名为
      Foobar.java
      。当您提取最新代码时,它会失败,因为签出将覆盖以下未跟踪的工作树文件…

      我所看到的唯一可靠的解决方法是:

    • git rm Foobar.java
    • 用一条你不能错过的消息提交它
      git Commit-m'TEMP Commit!!'
    • 这将弹出一个冲突,迫使您合并冲突-因为您的更改将其删除,但另一个更改将其重命名(因此出现问题)
    • 接受您的更改,即“删除”
    • git-rebase——继续
    • 现在放弃您的解决方法
      git-rebase-i HEAD~2
      drop
      临时提交
    • 确认该文件现在名为
      FooBar.java
    • 将文件
      Name.jpg
      重命名为
      name1.jpg

    • 提交删除的文件
      Name.jpg

    • 将文件
      name1.jpg
      重命名为
      name.jpg

    • 将添加的文件
      name.jpg
      修改为以前的提交

      git add name.jpg
      git commit --amend
      

    • 使用SourceTree,我能够从UI完成这一切

    • 重命名
      文件.ext
      任意.ext
    • 暂存该文件
    • 现在
      which.ext
      重命名为
      file.ext
    • 再次处理该文件

    • 这有点乏味,但是如果你只需要对几个文件进行重命名,它会非常快

      当你做了很多文件重命名,其中一些只是改变了大小写,很难记住哪个是哪个。手动“git移动”文件可能是相当多的工作。因此,在文件名更改任务期间,我将执行以下操作:

    • 将所有非git文件和文件夹删除到其他文件夹/存储库
    • 提交当前空git文件夹(这将显示为已删除的所有文件。)
    • 将所有文件添加回原始git文件夹/存储库
    • 提交当前非空git文件夹

    • 这将修复所有案例问题,而无需尝试找出您重命名的文件或文件夹

      我从其他答案中尝试了以下解决方案,但均无效:

      如果您的存储库是远程托管的(GitHub、GitLab、BitBucket),您可以在origin(GitHub.com)上重命名该文件,并强制以自顶向下的方式重命名该文件

      下面的说明适用于GitHub,但是它们背后的一般思想应该适用于任何远程存储库托管平台。请记住您试图重命名的文件类型很重要,即GitHub认为在浏览器中是可编辑(代码、文本等)还是不可编辑(图像、二进制等)的文件类型

    • 访问GitHub.com
    • 在GitHub.com上导航到您的存储库并选择您正在使用的分支
    • 使用站点的文件导航工具,导航到要重命名的文件
    • GitHub允许您在浏览器中编辑文件吗?
      • a、 )可编辑
      • 单击“编辑此文件”图标(看起来像铅笔)
      • 更改文件名文本输入中的文件名
      • git config core.ignorecase false
        git add name.jpg
        git commit --amend
        
        git rm -r --cached .
        git add --all .
        git commit -a -m "Versioning untracked files"
        git push origin master
        
        git mv CSS CSS2
        git mv CSS2 css
        
        git mv -f .\abcDEF.js  .\abcdef.js