我试图重命名一个文件有不同的大小写,从它之前:
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。
从Git 2.0.1(2014年6月25日)开始,Git mv只能在不区分大小写的操作系统上运行。
参见David Turner (dturner-tw)的commit baa37bf。
Mv:允许重命名来修复大小写不敏感的文件系统
在不区分大小写的文件系统上执行"git mv hello.txt hello.txt "总是会触发"destination already exists"错误,因为从文件系统的角度来看,这两个名字指向的是同一个路径,并且需要用户在修正索引和下一次提交中记录的路径的大小写时给出"——force"。
检测这种情况并允许它,而不需要“——force”。
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——强制目录下的所有文件都是小写的。例如,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存储库配置中获取配置键-值还是全局配置中获取配置键-值。例如,如果您想查找全局键核心。Ignorecase(如果命令没有返回,你可能需要用sudo作为前缀):
git config --global --get core.ignorecase
如果返回true,请确保将其设置为:
git config --global core.ignorecase false
(确保您有适当的权限更改全局。)
结果就是这样;现在你的Git安装不会忽略大写字母,并将它们视为变化。
作为一个建议,如果您正在开发多语言项目,并且您觉得Git不应该将所有项目都区分大小写,那么只需更新本地核心即可。ignorecase文件。
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