在Git中更改文件名的大小写


473

我正在尝试重命名文件以使其具有与之前不同的大小写:

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不会选择重命名(作为重命名作为新的未跟踪文件)。

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


49
这是因为osx文件系统默认情况下保持大小写且不区分大小写。您可以简单地进行两个步骤:git mv myfile foo; git mv foo MyFile
tonio

16
与“ git mv --force myfile MyFile”一起使用。
Marcello de Sales


7
从git 2.0.1(2014年6月)开始,git mv hello.txt Hello.txt将在不区分大小写的OS上运行。请在下面
VonC 2014年

Answers:


554

从Git 2.0.1(2014年6月25日)开始,a git mv将仅在不区分大小写的OS上工作

提交baa37bf大卫·特纳(dturner-tw

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添加并提交。


2
FWIW这使Windows退步或从未使用过。我在2.15.1.windows.2上,仍然需要使用--force
TTimo

1
@Adowrath好消息!
VonC

例如,如果文件名为image.TXT,而我想将其重命名为image.txt,则它是否也适用于扩展名大写
siluveru kiran kumar

@siluverukirankumar是的。您对那个用例有任何问题吗?
VonC

1
通过运行此命令git config core.ignorecase false
使它

452

考虑larsks的答案,您可以使用“ --force”使用单个命令来使其工作:

 git mv --force myfile MyFile

3
如果你是一个不区分大小写的文件系统上,你会得到一个致命的错误“无效参数”请尝试以下步骤来代替:stackoverflow.com/questions/3011625/...
列维

1
虽然这是第一步的正确答案,但是当另一个分支具有大写字母时,您如何继续在Mac OS X下切换到另一个分支。我得到****错误:结帐将覆盖以下未跟踪的工作树文件:****
TJChambers 2014年

1
这在Windows上对我的提交失败:Error: Will not add file alias 'MyFile' ('myfile' already exists in index)
OrangeDog '16

97

有时,您想在不区分大小写的文件系统上(例如,在OS X或Windows上)更改许多文件名的大小写。执行git mv命令会很快疲劳。为了使事情变得容易一些,这是我要做的:

  1. 将所有文件移出目录,例如到桌面。
  2. 做一个 git add . -A去除所有文件。
  3. 将桌面上的所有文件重命名为正确的大小写。
  4. 将所有文件移回原始目录。
  5. 做一个git add .。Git应该看到文件已重命名。

现在,您可以进行一次提交,说您已更改文件名大写。


3
这是以牺牲所有历史记录为代价的,对吗?我猜git mv --force没有这个缺点。
LOAS

12
不,这不会删除所有历史记录。注意,两个添加之间没有提交。
Michael L Perry19年

63

OS X下的文件名不区分大小写(默认情况下)。这更多的是操作系统问题,而不是Git问题。如果删除并读取了文件,则应获取所需的文件,或将其重命名为其他名称,然后重命名。


2
您也可以git clone在Linux系统上进行回购,重命名文件并仅针对这种情况提交(如果您手头有Linux系统)。
gitaarik 2014年

4
实际上,OS X上的文件系统可能区分大小写,您可以在安装时对其进行配置。如何检查OS X分区是否区分大小写
Flimm,2015年

2
...因此答案中的“(默认情况下)”。
larsk

4
要确认,您可以使用git rm --cached fileorfolder从git中删除文件或文件夹,而无需从文件系统中删除文件或文件夹。然后,您可以使用再次简单地添加文件或文件夹git add fileorfolder
卡斯

32

设置ignorecasefalsegit config

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

如果要更改项目中文件名的大小写,则无需从Git 强制重命名。IMO,我宁愿从我的IDE /编辑器中更改大小写,并确保正确配置Git来进行重命名。

默认情况下,Git模板设置为忽略大小写(Git不区分大小写)。要验证您是否具有默认模板,请使用--get来检索指定键的值。使用--local--global指示Git是从本地Git存储库配置中获取配置键值还是从全局配置中获取配置键值。例如,如果您要查找全局密钥core.ignorecase

git config --global --get core.ignorecase

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

git config --global core.ignorecase false

(确保您具有适当的权限才能更改全局。)现在,您的Git安装程序将不会忽略大小写并将其视为更改。

作为建议,如果您正在处理多语言项目,并且觉得Git不应将所有项目都区分大小写,则只需更新本地core.ignorecase文件即可。


6
如果git config --global --get core.ignorecase不返回任何内容。是true吗?? 因为在将其设置为falsefalse 之后,它会返回false(Windows 10)
fralbo

它似乎没有按预期工作。我的意思是桌面客户端看到了更改,但是在提交/同步之后,文件名保持在线不变!
fralbo

为我工作(与相比,使用多个文件更好git mv)。我还假设默认情况下它被认为是正确的(即忽略大小写)。要么,要么与操作系统的策略匹配文件名大小写。
杰瑞

那就是答案。刚用过。
Dave Everitt

1
这应该是选定的答案
Dave Everitt

7

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


似乎应该将其更改为false,以便git区分大小写?
乔纳森

1

git mv在macOS上将文件批量化为小写:

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

它将小写文件夹中的所有文件。


1

该Python代码段会将git mv --force目录中的所有文件都转换为小写。例如,foo / Bar.js将通过以下方式变为foo / bar.js:git mv foo/Bar.js foo/bar.js --force

根据自己的喜好对其进行修改。我只是想分享一下:)

import os
import re

searchDir = 'c:/someRepo'
exclude = ['.git', 'node_modules','bin']
os.chdir(searchDir)

for root, dirs, files in os.walk(searchDir):
    dirs[:] = [d for d in dirs if d not in exclude]
    for f in files:
        if re.match(r'[A-Z]', f):
            fullPath = os.path.join(root, f)
            fullPathLower = os.path.join(root, f[0].lower() + f[1:])
            command = 'git mv --force ' + fullPath + ' ' + fullPathLower
            print(command)
            os.system(command)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.