关于重命名:在Git中更改文件名的大小写

Changing capitalization of filenames in Git

我试图重命名一个文件,使其大小写与以前不同:

1
2
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 10.7.3和Git 1.7.9.1,使用的是zsh 4.3.15。


考虑到上面的答案,您可以使用带有"-force"的单个命令:

1
 git mv --force myfile MyFile


从Git2.0.1开始(2014年6月25日),git mv只适用于不区分大小写的操作系统。

见David Turner的Commit Baa37bf(dturner-tw)

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

在不区分大小写的文件系统上,"EDOCX1"〔6〕总是触发"destination already exists错误,因为从文件系统的角度来看,这两个名称指的是相同的路径,并且要求用户在更正索引和下一次提交中记录的路径的大小写时给出"EDOCX1"〔8〕。

Detect this case and allow it without requiring"--force".

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


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

  • 将所有文件移到目录之外,比如桌面。
  • 执行git add . -A以删除所有文件。
  • 将桌面上的所有文件重命名为适当的大小写。
  • 将所有文件移回原始目录。
  • 做一个git add .git应该看到文件被重命名。
  • 现在,您可以承诺更改了文件大小写。


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


    因为操作是关于"更改Git中文件名的大小写"的:

    如果您试图在项目中更改文件名的大写,则无需强制将其从Git中重命名。在我看来,我更愿意从我的IDE/编辑器中更改大写,并确保我正确配置了git以获取重命名。

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

    1
    git config --global --get core.ignorecase

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

    1
    git config --global core.ignorecase false

    (确保您具有更改全局设置的适当权限)现在你有了它,你的Git不会忽视资本化,把它们当作是变化。

    作为一个建议,如果您正在从事多语言项目,并且您认为不是所有项目都应该被Git视为区分大小写的,只需更新本地core.ignorecase


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


    要在MacOS上将git mv文件批量转换为小写:

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

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


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

    修改到你喜欢的程度,我想我会分享:)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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)