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

我通过将第一个字母去大写来更改了一些文件名,如Name.jpgname.jpg。Git无法识别此更改,我不得不删除文件并再次上传。有没有办法让Git在检查文件名更改时区分大小写?我没有对文件本身进行任何更改。

519644 次浏览

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

git config core.ignorecase false

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

需求文档

#0留档

core.ignorecase

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

默认值为false,除了克隆体(1)git-init(1)将在创建存储库时探测并设置core.ignorecase true(如果合适)。

不区分大小写的文件系统

我所知道的两种最流行的不区分大小写的文件系统是

  • windows
  • osx

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

git mv File file.tmpgit mv file.tmp file

两步,因为否则我得到了一个“文件存在”错误。也许可以通过添加--cached或其他方式在一步中完成。

只要你只是重命名文件,而不是文件夹,你就可以使用git mv

git mv -f yOuRfIlEnAmE yourfilename

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

在OSX下,为了避免此问题并避免在不区分大小写的文件系统上进行开发时出现其他问题,您可以使用Disk实用程序创建一个对case敏感的虚拟驱动器/磁盘映像。

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

Mac磁盘实用程序截图

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

git config core.ignorecase false

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

有人提交了一个文件:Foobar.java,几天后决定将其重命名为FooBar.java。当你拉取最新的代码时,它会以The following untracked working tree files would be overwritten by checkout...失败

我见过的唯一可靠的解决方法是:

  1. git rm Foobar.java
  2. 提交一条你不能错过的消息git commit -m 'TEMP COMMIT!!'
  3. 这将弹出一个冲突,迫使您合并冲突-因为您的更改删除了它,但另一个更改重命名了它(因此问题)
    1. 接受您的更改,即“删除”
    2. git rebase --continue
  4. 现在放下你的解决方法git rebase -i HEAD~2dropTEMP COMMIT!!
  5. 确认文件现在被称为FooBar.java
  1. 将文件Name.jpg重命名为name1.jpg

  2. 提交删除的文件Name.jpg

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

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

    git add name.jpggit commit --amend

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

  1. 重命名FILE.extwhatever.ext
  2. 阶段该文件
  3. 现在重命名whatever.extfile.ext
  4. 阶段这个文件

这有点乏味,但如果您只需要对几个文件进行操作,它会很快

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

  1. 删除所有非git文件和文件夹到不同的文件夹/存储库。
  2. 提交当前的空git文件夹(这将显示为已删除的所有文件。)
  3. 将所有文件添加回原始git文件夹/存储库。
  4. 提交当前非空git文件夹。

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

我从其他答案中尝试了以下解决方案,但它们不起作用:

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

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

  1. 参观GitHub.com
  2. 在GitHub.com上导航到您的存储库并选择您正在使用的分支
  3. 使用站点的文件导航工具,导航到您打算重命名的文件
  4. GitHub是否允许您在浏览器中编辑文件?
    • a.)可编辑
      1. 单击“编辑此文件”图标(它看起来像一支铅笔)
      2. 更改文件名文本输入中的文件名
    • b.)不可
      1. 在新选项卡中打开“下载”按钮并将文件保存到您的计算机
      2. 重命名下载的文件
      3. 在GitHub.com上的上一个选项卡中,单击“删除此文件”图标(它看起来像垃圾桶)
      4. 确保选中“直接提交到branchname分支”单选按钮并单击“提交更改”按钮
      5. 在GitHub.com的同一目录中,单击“上传文件”按钮
      6. 从您的计算机上传重命名的文件
  5. 确保选中“直接提交到branchname分支”单选按钮并单击“提交更改”按钮
  6. 本地,检出/获取/拉取分支
  7. 成交

Mac OSX High Sierra 10.13在一定程度上修复了这个问题。只需为您的git项目创建一个虚拟APFS分区,默认情况下它没有大小限制,也不占用空间。

  1. 在磁盘实用程序中,选择容器磁盘时单击+按钮
  2. 在格式下选择APFS(大小写敏感)
  3. 命名Sensitive
  4. 利润
  5. 可选:在敏感中创建一个名为gitln -s /Volumes/Sensitive/git /Users/johndoe/git的文件夹

你的驱动器将在/Volumes/Sensitive/

在此处输入图片描述

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

有时暂时更改Git的大小写敏感性很有用。

方法#1-更改单个命令的大小写敏感性:

git -c core.ignorecase=true checkout mybranch关闭单个checkout命令的大小写敏感性。或者更一般地说:#3#4(感谢VonC在评论中提出这一点。

方法#2-更改多个命令的大小写敏感性:

要将设置更改更长时间(例如,如果在更改之前需要运行多个命令):

  1. git config core.ignorecase(这返回当前设置,例如false)。
  2. git config core.ignorecase#1-设置所需的新设置。
  3. …运行多个其他命令…
  4. git config core.ignorecase#1-将配置值设置回其先前的设置。

我使用了以下步骤:

git rm -r --cached .git add --all .git commit -a -m "Versioning untracked files"git push origin master

对我来说是一个简单的解决方案

如果不起作用,请使用git rm文件名从磁盘中删除文件并将其添加回来。

类似于@Sijmen的回答,这是我在OSX上工作的时候重命名目录(灵感来自另一个帖子的这个答案):

git mv CSS CSS2git mv CSS2 css

简单地做git mv CSS css给出了无效的参数错误:fatal: renaming '/static/CSS' failed: Invalid argument可能是因为OSX的文件系统是不区分大小写

p. s顺便说一句,如果您使用的是Django,Collect静态也无法识别大小写差异,您还必须在静态根目录中手动执行上述操作

我选择了@陈志立的答案并编写了一个Python 3脚本来使用文件列表来完成它:

#!/usr/bin/env python3# -*- coding: UTF-8 -*-
import osimport shleximport subprocess
def run_command(absolute_path, command_name):print( "Running", command_name, absolute_path )
command = shlex.split( command_name )command_line_interface = subprocess.Popen(command, stdout=subprocess.PIPE, cwd=absolute_path )
output = command_line_interface.communicate()[0]print( output )
if command_line_interface.returncode != 0:raise RuntimeError( "A process exited with the error '%s'..." % (command_line_interface.returncode ) )
def main():FILENAMES_MAPPING = \[(r"F:\\SublimeText\\Data", r"README.MD", r"README.md"),(r"F:\\SublimeText\\Data\\Packages\\Alignment", r"readme.md", r"README.md"),(r"F:\\SublimeText\\Data\\Packages\\AmxxEditor", r"README.MD", r"README.md"),]
for absolute_path, oldname, newname in FILENAMES_MAPPING:run_command( absolute_path, "git mv '%s' '%s1'" % ( oldname, newname ) )run_command( absolute_path, "git add '%s1'" % ( newname ) )run_command( absolute_path,"git commit -m 'Normalized the \'%s\' with case-sensitive name'" % (newname ) )
run_command( absolute_path, "git mv '%s1' '%s'" % ( newname, newname ) )run_command( absolute_path, "git add '%s'" % ( newname ) )run_command( absolute_path, "git commit --amend --no-edit" )
if __name__ == "__main__":main()

我们可以使用git mv命令。下面的示例,如果我们将文件abcDEF.js重命名为abcdef.js那么我们可以从终端运行以下命令

git mv -f .\abcDEF.js  .\abcdef.js

使用以下命令:

git config --global  core.ignorecase false

您可以全局配置您的git系统对文件和文件夹名称区分大小写。

因此,对于GitHub如何处理这个区分大小写的部署问题,有很多解决方案。

在我的例子中,我将文件名大小写约定从大写更改为小写。

我相信git可以跟踪更改,但此命令git config core.ignorecase false决定了git在幕后的操作方式

在我的例子中,我运行命令,git突然有很多标记为未跟踪的文件要跟踪。

然后我点击git add.,然后git提交并再次在netlify上运行我的构建。

然后现在显示的所有错误都可以被跟踪,例如Module not found: Can't resolve './Components/ProductRightSide' in '/opt/build/repo/components/products并修复,以便git能够成功跟踪和实现更改。

这是一个很好的解决方法,远离挫折,但相信我,这肯定会奏效。

PS:修复问题后,您可能需要运行命令git config core.ignorecase true恢复git如何区分大小写。

此外,注意git config core.ignorecase false与其他文件扩展名存在问题,因此您可能需要注意,如果您知道自己在做什么并且确信这一点,请这样做。

这是netlify上的线程,可能会有所帮助

我为自己制作了一个小写存储库文件名的bash脚本:

function git-lowercase-file {tmp="tmp-$RANDOM-$1"new=$(echo "$1" | tr '[:upper:]' '[:lower:]')git mv -f $1 $tmpgit mv -f $tmp $new}

然后你可以像这样使用它:

git-lowercase-file Name.jpg

如果您正在进行更复杂的更改,例如目录名称大小写更改,您可以从Linux机器进行更改,因为Linux本身(以及Linux上的git)将具有相同名称但不同大小写的文件/目录视为完全不同的文件/目录。

因此,如果您在Windows上,您可以使用WSL安装Ubuntu,在那里克隆您的存储库,使用VSCode打开克隆的存储库目录(使用WSL远程扩展从Windows访问WSL Ubuntu),然后您将能够通过VSCode进行重命名并使用VSCode git集成提交/推送它们。