你如何在Git中更改文件名的大写形式?

708

我正在尝试将文件的名称更改为与之前不同的大小写形式:

git mv src/collision/b2AABB.js src/collision/B2AABB.js
fatal: destination exists, source=src/collision/b2AABB.js, destination=src/collision/B2AABB.js

如你所见,Git 对此有些不满。我试过使用普通的mv 命令进行重命名,但是 Git 没有检测到这个重命名(无论作为已重命名文件或新的未被跟踪的文件)。

如何更改文件名称的大小写?我使用 Mac OS X v10.7.3(Lion),Git 1.7.9.1和Z shell (zsh) 4.3.15。


68
因为OSX文件系统默认是大小写保留但不区分大小写,所以您可以简单地按照以下两个步骤进行操作: git mv myfile foo; git mv foo MyFile - tonio
27
已经使用"git mv --force myfile MyFile"成功运作。 - Marcello DeSales
3
这是一个重复的问题,来源于stackoverflow网站:https://dev59.com/GGw05IYBdhLWcg3w_W1N 。问题描述为更改了文件夹名称的大小写后,Git似乎没有相应更新。请提供翻译。 - jackocnr
8
从git 2.0.1(2014年6月)开始,在大小写不敏感的操作系统上,git mv hello.txt Hello.txt 命令将能够正常使用。请参考下面的回答 - VonC
1
链接 https://dev59.com/DXI-5IYBdhLWcg3wj5JG - Oleg Estekhin
12个回答

918

从Git 2.0.1版本(2014年6月25日)开始,git mv 在不区分大小写的操作系统上将直接工作。

请参见David Turner (dturner-tw)提交的baa37bf

mv:允许在不区分大小写的文件系统中更改名称以修复大小写问题。

在不区分大小写的文件系统上,使用“git mv hello.txt Hello.txt”总是会触发“destination already exists”错误,因为在文件系统的角度看,这两个名称指向同一路径,并且需要用户在纠正索引和下次提交记录的路径大小写时提供“--force”参数。

检测到此情况后,允许无需使用“--force”参数。

git mv hello.txt Hello.txt 现在可以直接工作(无需再使用 --force 参数)。


另一种选择是:

git config --global core.ignorecase false

直接重命名文件;git add和commit。

在CMD中可以工作,但可能会在git bash(Windows上)会话中失败(请参见Louis-Caron答案)。

正如jaquinocode评论中所指出的那样,如果您的本地存储库本身具有该设置:

git config --local core.ignorecase false

7
就我所知,这在Windows上已经退化或从未正常工作。我使用的版本是2.15.1.windows.2,仍需要使用--force选项。 - TTimo
1
@Adowrath 太好了! - VonC
使用命令 git mv hello.txt Hello.txt,然后执行 git reset 将会在文件系统中留下一个 Hello.txt 文件,而不是原始的 hello.txt - Evi Song
12
在 Windows 平台上,通过运行以下命令并执行 git config core.ignorecase false 可以使此功能正常工作。 - John Targaryen
1
@jaquinocode 很好的观点。我已经将您的评论包含在答案中以增加可见性。 - VonC
显示剩余8条评论

526

参考larsks的回答,您可以使用单个带有--force参数的命令来使其正常工作:

git mv --force myfile MyFile

3
如果你在一个不区分大小写的文件系统上遇到了致命错误 "Invalid Argument",请尝试以下步骤:https://dev59.com/QHA75IYBdhLWcg3w8-LZ - Levi
4
虽然这是第一步的正确答案,但当另一个分支具有旧的大写形式时,您如何继续在Mac OS X下切换到另一个分支。我收到了错误提示:**** error: The following untracked working tree files would be overwritten by checkout: ****。 - TJChambers
2
这在Windows上提交时失败了:错误:不会添加文件别名'MyFile'('myfile'已存在于索引中) - OrangeDog

161
有时候你想更改大小写不敏感的文件系统(例如在 macOS 或 Windows 上)中许多文件的大小写。单独运行git mv命令会很快变得无聊。为了使事情变得更容易,我会做以下操作:
  1. 将所有受影响的文件移动到目录之外,比如说桌面上。
  2. 执行 git add . -A 命令来暂存这些文件的删除。
  3. 将桌面上的所有文件重命名为正确的大小写。
  4. 将所有文件移回原始目录。
  5. 执行 git add . 命令。Git 应该会发现文件已被重命名。
现在,您可以提交一个说明您已更改文件名大小写的提交。

3
在移进和移出的文件中,这样做会牺牲所有历史记录,对吗?我猜测使用“git mv --force”命令不会有这个缺点。 - LOAS
20
不会删除所有历史记录。请注意,在两次添加之间没有提交记录。 - Michael L Perry
这真是我需要的。干得好!它也应该是一个答案。谢谢! - Mehmet Kurtipek
请参考@softarn的答案,其中提供了一个方便的一行代码来完成所有操作 :) - waldyrious
4
更简单、更规范的方法是使用 git rm -r --cached . + git add --all . 命令,详见此答案,该回答值得获得更多的赞。 - Inigo

73

在 OS X 操作系统下,默认情况下文件名不区分大小写。这更像是一个操作系统的问题而不是 Git 的问题。如果你移除然后再添加该文件,你应该能得到你想要的结果,或者将其重命名为其他名称,然后再重新命名回来。


2
你也可以在Linux系统上使用git clone克隆存储库,重命名文件并仅为此情况提交它们(如果你手头有Linux系统的话)。 - gitaarik
4
实际上,OS X 上的文件系统可以区分大小写,你可以在安装时进行配置。如何检查 OS X 分区是否区分大小写 - Flimm
2
因此答案中有“(默认)”这个词。 - larsks
8
确认一下,您可以使用 git rm --cached 文件或文件夹名 命令从 Git 中删除文件或文件夹,但不会从文件系统中删除。之后,您可以使用 git add 文件或文件夹名 命令将该文件或文件夹再次添加到 Git 中。 - kas

59

在git配置中将ignorecase设置为false

由于原始帖子是关于“更改Git中文件名的大写形式”的:

如果您想要更改项目中文件名的大小写形式,您不需要从Git中强制重命名它。我个人认为,我宁愿从我的IDE/编辑器更改大小写形式,并确保我正确配置了Git以接收重命名。

默认情况下,Git模板设置为忽略大小写(Git不区分大小写)。要验证您是否有默认模板,请使用--get检索指定键的值。使用--local--global来告诉Git是否从本地Git存储库配置或全局存储库配置中获取配置键值。例如,如果要查找全局键core.ignorecase(如果命令返回空,则可能需要以sudo为前缀):

git config --global --get core.ignorecase

如果这个返回 true,请确保将其设置为:

git config --global core.ignorecase false

(确保您拥有更改全局权限。)

这样,您的Git安装就不会忽略大写字母并将其视为更改。

建议:如果您正在处理多语言项目,并且认为不应将所有项目作为Git区分大小写,请更新本地core.ignorecase文件。


11
如果git config --global --get core.ignorecase没有返回任何内容,那么它是true吗?因为在我将其设置为false后,它返回了false(在Windows 10上)。 - fralbo
2
似乎并没有按预期工作。我的意思是桌面客户端看到了更改,但提交/同步后,在线上文件名仍然没有改变! - fralbo
对我来说很有效(比使用git mv更适用于多个文件)。我还假设默认情况下它被认为是真的(即忽略大小写)。要么如此,要么它符合操作系统对文件名大小写的策略。 - Jerry
那就是答案。我刚用过它。 - Dave Everitt
1
这应该是被选中的答案。 - Dave Everitt
2
更改全局设置可能无效,因为本地设置会覆盖它。如果它对您不起作用,请同时检查两者。 - Xcalibur

12

你可以打开“.git”目录,然后编辑“config”文件。在"[core]"设置下,设置"ignorecase = true",然后就完成了 ;)


5
看起来应该将其更改为false,这样git才会区分大小写? - Jonathan
1
没错,我个人非常讨厌Git调用“智能”行为并尝试转换我的文件的行结尾。这是一个糟糕的“智能”功能,我目前非常厌恶它,因为我主要在Windows下为Linux机器编写代码,所以我会选择“按原样签出,按原样提交”。 - Деян Добромиров

8

AnswerVonc提供的答案是完全正确的,但仍存在一种可能的情况,即您的重命名操作在Windows Git中无法正常工作:

假设您想将dir/mypath重命名为dir/myPath:

git mv dir/mypath dir/myPath

但它失败了报告:
Rename from 'dir/mypath' to 'dir/mypath' failed. Should I try again? (y/n) 

问题在于bash已经默默地将你的命令行dir/myPath替换为dir/mypath,因为它检测到存在一个不同大小写的路径。
解决方法是使用中间移动操作:
git mv dir/mypath dir/mypath_temp
git mv dir/mypath_temp dir/myPath

7

如何在macOS和Windows上使用git bash批量将文件名转换为小写:

for f in *; do git mv "$f" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done

它将会把文件夹中的所有文件名转换为小写。

1
它在Git Bash中的Windows上也可以运行。感谢您节省了我很多时间! :) - Vincent Gagnon
@VincentGagnon 很高兴听到这个消息!已经更新了答案并添加了该信息。 - softarn

2
如果你想将文件名改为大写,你可以直接进入 Github 仓库并点击“.”,即点号,这将打开在线编辑器。在那里进行更改,并使用左侧的源代码控制图标提交更改。

1
你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文献,以便他人可以确认你的回答是正确的。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community
1
你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

2

工作示例:

git mv ./src/images/poster_video.PNG ./src/images/poster_video.png

2
你的回答并没有解决原问题。你将扩展名转换为小写了。 - Tavo
1
我正在寻找与此完全相同的东西,但是针对500幅图像。我想在git上将./src/images/TESTIMAGE.png 重命名为./src/images/testimage.png。 - Mohak Londhe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接