604

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

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) 上。

4

11 回答 11

753

从 Git 2.0.1(2014 年 6 月 25 日)开始, agit mv将仅适用于不区分大小写的 OS

请参阅David Turner ( )提交 baa37bfdturner-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 添加并提交。

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

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

git config --local core.ignorecase false
于 2014-07-27T08:00:46.397 回答
492

考虑到larsks 的回答,您可以使用带有“--force”的单个命令使其工作:

 git mv --force myfile MyFile
于 2013-04-17T22:31:10.790 回答
138

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

  1. 将所有受影响的文件移到目录之外,比如说桌面。
  2. 做一个git add . -A阶段删除这些文件。
  3. 将桌面上的所有文件重命名为正确的大小写。
  4. 将所有文件移回原始目录。
  5. 做一个git add .。Git 应该看到文件被重命名。

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

于 2014-05-12T12:46:05.220 回答
69

OS X 下的文件名不区分大小写(默认情况下)。这更像是一个操作系统问题而不是 Git 问题。如果您删除并读取该文件,您应该得到您想要的,或者将其重命名为其他名称,然后将其重命名。

于 2012-05-09T20:51:36.003 回答
46

在 git 配置中设置ignorecasefalse

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

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

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

git config --global --get core.ignorecase

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

git config --global core.ignorecase false

(确保您具有更改全局的适当权限。)您拥有它;现在你的 Git 安装不会忽略大小写并将它们视为更改。

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

于 2015-11-16T09:38:02.207 回答
10

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

于 2017-03-14T07:24:50.653 回答
6

在 macOS 上将文件批量git mv转换为小写,在 Windows 上将文件批量转换为 git bash:

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

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

于 2016-12-06T07:54:50.080 回答
4

Vonc的回答是完全正确的,但仍然存在您的重命名操作不适用于 git for windows 的潜在情况:

假设您要将 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/myPathdir/mypath因为它检测到这样的路径存在不同的大小写。

解决方案是使用中间移动操作:

git mv dir/mypath dir/mypath_temp
git mv dir/mypath_temp dir/myPath
于 2021-06-29T06:02:02.723 回答
1

这个 Python 片段将git mv --force目录中的所有文件都变为小写。例如, 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)
于 2015-03-01T04:05:42.290 回答
1

工作示例:

git mv ./src/images/poster_video.PNG ./src/images/poster_video.png
于 2019-11-25T15:29:07.357 回答
0

我在 Sourcetree 的 Windows 上得到了以下更改:

在此处输入图像描述

我通过从文件系统中删除文件来解决它:

在此处输入图像描述

然后只需丢弃我要保留的文件并提交:

在此处输入图像描述

现在一切都按预期工作。

在此处输入图像描述

基于这个答案:

https://stackoverflow.com/a/66121726/3850405

于 2021-05-10T20:08:34.953 回答