在Git中更改文件名的大写

我试图重命名一个文件有不同的大小写,从它之前:

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。

265049 次浏览

OS X下的文件名不区分大小写(默认情况下)。这与其说是Git的问题,不如说是操作系统的问题。如果删除并读取该文件,则应该得到您想要的内容,或者将其重命名为其他内容,然后再重命名回来。

考虑larsks的回答,你可以用“——force”命令让它工作:

 git mv --force myfile MyFile

有时你想在一个不区分大小写的文件系统(例如在macOS或Windows上)上更改许多文件名的大写。单独执行git mv命令很快就会厌倦。为了让事情变得简单一点,我是这样做的:

  1. 将所有受影响的文件从目录移到桌面。
  2. 执行git add . -A来删除这些文件。
  3. 将桌面上的所有文件重命名为适当的大写。
  4. 将所有文件移回原始目录。
  5. git add .。Git应该可以看到文件被重命名了。

现在您可以进行提交,表示您已经更改了文件名大写。

启动Git 2.0.1(2014年6月25日),一个git mv只适用于不区分大小写的操作系统

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

mv:允许重命名来修复不区分大小写的文件系统

“# EYZ0"在不区分大小写的文件系统上总是触发"destination already exists"错误,因为从文件系统的角度来看,这两个名称指的是同一个路径,并且需要用户给出"--force"当修正在索引和下一次提交中记录的路径的大小写时。

发现这种情况并允许它发生,而不需要“--force"”

git mv hello.txt Hello.txt可以工作(不再需要--force)。


另一种选择是:

git config --global core.ignorecase false

并直接重命名文件;Git添加并提交。

它在CMD中工作。它可能会在git bash会话中失败(在Windows上)(参见Louis-Caron回答)

正如的评论中的jaquinocode所指出的,如果你的本地存储库本身有这样的设置:

git config --local core.ignorecase false

这个Python代码片段将git mv --force目录下的所有文件改为小写。例如,foo/Bar.js将通过git mv foo/Bar.js foo/bar.js --force变成foo/Bar.js。

根据你的喜好修改它。我只是想分享:)

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)

在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文件即可。

在macOS上将git mv文件打包成小写,在Windows上将git bash打包成小写:

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

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

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

工作的例子:

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

我在Sourcetree中对Windows进行了以下更改:

enter image description here

我通过从文件系统中删除文件来解决这个问题:

enter image description here

然后简单地丢弃我想要保留的文件并提交:

enter image description here

现在一切都按预期进行。

enter image description here

基于这个答案:

https://stackoverflow.com/a/66121726/3850405 < a href = " https://stackoverflow.com/a/66121726/3850405 " > < / >

回答 by Vonc是完全正确的,但是仍然有一个潜在的情况,你的重命名操作将无法在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