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

时间:2012-05-09 20:46:52

标签: git rename case-sensitive file-rename

我正在尝试将文件重命名为与之前的大小写不同:

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没有获取重命名(作为重命名作为新的未跟踪文件)。

如何将文件更改为具有相同名称的不同大小写?我使用zsh 4.3.15在Mac OS X 10.7.3上使用git 1.7.9.1。

11 个答案:

答案 0 :(得分:428)

考虑到上面的答案,您可以使用“--force”的单个命令来使用它:

 git mv --force myfile MyFile

答案 1 :(得分:427)

启动git 2。0。1(2014年6月25日), git mv只适用于不区分大小写的操作系统

commit baa37bf

David Turner (dturner-tw)

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

" git mv hello.txt Hello.txt"在不区分大小写的文件系统上总是触发" destination already exists"错误,因为这两个名称从文件系统的角度引用相同的路径,并要求用户给出" --force"纠正索引中记录的路径和下次提交时的情况。

  

检测此案例并允许其不需要" --force"。

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

答案 2 :(得分:78)

有时您希望更改不区分大小写的文件系统上的大量文件的大小写(例如,在OS X或Windows上)。执行git mv命令会很快发生,为了让事情变得更容易,这就是我的工作:

  1. 将所有文件移到目录之外,让我们说桌面。
  2. 执行git add . -A删除所有文件。
  3. 将桌面上的所有文件重命名为正确的大小写。
  4. 将所有文件移回原始目录。
  5. git add . git应该看到文件已重命名。
  6. 现在您可以提交一份提示,说明您已更改了文件大小写。

答案 3 :(得分:59)

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

答案 4 :(得分:21)

由于OP是关于“改变Git中文件名的大写”:

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

默认情况下,git模板设置为忽略大小写(git大小写不敏感)。要验证您是否具有默认模板,请使用--get来检索指定键的值。使用--local--global表示git是否从本地git repo配置或全局配置中获取配置键值。作为一个示例,如果您要查找全局密钥core.ignorecase

git config --global --get core.ignorecase

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

git config --global core.ignorecase false

(确保您拥有更改全局的适当权限) 你有它,现在你的git不会忽视Capitalisations并将它们视为变化。

作为建议,如果您正在处理多语言项目,并且您觉得并非所有项目都应该被git视为区分大小写,那么只需更新本地core.ignorecase

答案 5 :(得分:6)

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

答案 6 :(得分:1)

这个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)

答案 7 :(得分:1)

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

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

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

答案 8 :(得分:1)

Answer

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

答案 9 :(得分:0)

我在 Sourcetree 的 Windows 上进行了以下更改:

enter image description here

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

enter image description here

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

enter image description here

现在一切都按预期进行。

enter image description here

基于这个答案:

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

答案 10 :(得分:-1)

工作示例:

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