1762

我已经通过取消首字母大写更改了一些文件名,Name.jpgname.jpg. Git 无法识别这些更改,我不得不删除这些文件并再次上传它们。Git 在检查文件名更改时是否可以区分大小写?我没有对文件本身进行任何更改。

4

17 回答 17

1961

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

git mv -f yOuRfIlEnAmE yourfilename

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

于 2014-01-03T15:57:03.630 回答
1375

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

git config core.ignorecase false

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

文档

git config文档中:

core.ignorecase

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

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

不区分大小写的文件系统

我所知道的两个最流行的具有不区分大小写文件系统的操作系统是

  • 视窗
  • 操作系统
于 2013-07-16T22:52:26.987 回答
236

使用 SourceTree,我可以从 UI 中完成这一切

  1. 重命名 FILE.extwhatever.ext
  2. 暂存该文件
  3. 现在重命名 whatever.extfile.ext
  4. 再次暂存该文件

这有点乏味,但是如果您只需要对几个文件执行此操作,则非常快

于 2016-10-28T14:40:00.320 回答
153

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

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

两个步骤,否则我会收到“文件存在”错误。--cached也许可以通过添加等一步完成。

于 2013-11-13T14:27:25.927 回答
98

有时临时更改 Git 的区分大小写很有用。

方法 #1 - 更改单个命令的区分大小写:

git -c core.ignorecase=true checkout mybranch关闭单个checkout命令的大小写敏感性。或更一般地说:. (感谢 VonC 在评论中提出的建议。)git -c core.ignorecase= <<true or false>> <<command>>

方法 #2 - 更改多个命令的区分大小写:

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

  1. git config core.ignorecase(这将返回当前设置,例如false)。
  2. git config core.ignorecase <<true or false>>- 设置所需的新设置。
  3. ...运行多个其他命令...
  4. git config core.ignorecase <<false or true>>- 将配置值设置回之前的设置。
于 2018-07-10T11:05:00.207 回答
90

我使用了以下步骤:

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

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

于 2019-04-05T18:30:02.343 回答
46

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

git mv -f .\abcDEF.js  .\abcdef.js
于 2020-03-26T04:18:19.317 回答
44

在 OSX 下,为了避免这个问题并避免在不区分大小写的文件系统上开发的其他问题,您可以使用磁盘工具来创建区分大小写的虚拟驱动器/磁盘映像。

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

Mac 磁盘工具截图

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

git config core.ignorecase false
于 2014-10-03T19:18:02.933 回答
25

与@Sijmen 的回答类似,这对我在 OSX 上重命名目录时有用(灵感来自另一篇文章的回答)

git mv CSS CSS2
git mv CSS2 css

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

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

于 2019-05-22T06:28:06.223 回答
23
  1. 将文件重命名Name.jpgname1.jpg

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

  3. 将文件重命名name1.jpgname.jpg

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

    git add name.jpg
    git commit --amend
    
于 2016-10-03T19:13:25.780 回答
23

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

如果您的存储库是远程托管的(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. 完毕
于 2017-10-31T18:22:12.743 回答
10

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

  1. 在磁盘工具中,在选择容器磁盘时单击 + 按钮
  2. 在格式下选择 APFS(区分大小写)
  3. 给它命名Sensitive
  4. 利润
  5. 可选:在 Sensitive 中创建一个名为gitandln -s /Volumes/Sensitive/git /Users/johndoe/git

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

在此处输入图像描述

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

于 2018-03-06T15:01:56.657 回答
10

使用以下命令:

git config --global  core.ignorecase false

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

于 2021-10-19T06:39:04.257 回答
4

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

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

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

于 2017-04-29T11:00:41.837 回答
3

我在 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
于 2016-08-05T17:23:13.150 回答
2

我接受了@CBarr的回答并编写了一个 Python 3 脚本来使用文件列表来执行此操作:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import os
import shlex
import 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()
于 2019-09-29T22:50:53.443 回答
1

如果没有任何效果,请使用 git rm filename 从磁盘中删除文件并将其添加回来。

于 2019-04-12T18:11:26.937 回答