【问题标题】:Changing capitalization of filenames in Git在 Git 中更改文件名的大小写
【发布时间】:2012-05-18 10:13:58
【问题描述】:

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

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 rename case-sensitive file-rename


【解决方案1】:

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

commit baa37bfDavid Turner (dturner-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-Caronanswer

【讨论】:

  • FWIW 这在 Windows 上退化或从未工作过。我在 2.15.1.windows.2 并且仍然需要使用 --force
  • @Adowrath 好消息!
  • 这是否也适用于扩展大写例如,如果有文件名 image.TXT 并且我想将其重命名为 image.txt
  • @siluverukirankumar 是的。你对那个用例有什么问题吗?
  • 通过运行此命令和git config core.ignorecase false使其在 Windows 上工作
【解决方案2】:

考虑到larsks' answer,您可以使用带有“--force”的单个命令:

 git mv --force myfile MyFile

【讨论】:

  • 如果您在不区分大小写的文件系统上遇到致命错误“无效参数”,请尝试以下步骤:stackoverflow.com/questions/3011625/…
  • 虽然这是第一步的正确答案,但是当另一个分支具有旧的大写字母时,如何继续切换到 Mac OS X 下的另一个分支。我得到 **** 错误:以下未跟踪的工作树文件将被结帐覆盖:****
  • 在 Windows 上提交失败:Error: Will not add file alias 'MyFile' ('myfile' already exists in index)
【解决方案3】:

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

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

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

【讨论】:

  • 这是以您移入和移出文件中的所有历史记录为代价的,对吗?我猜 git mv --force 没有这个缺点。
  • 不,这不会删除所有历史记录。请注意,两个添加之间没有提交。
  • 这正是我所需要的。做得好。它也应该是一个答案。谢谢!
  • 另见@softarn 的answer,它提供了一种方便的单线方式,可以一次性完成所有操作:)
【解决方案4】:

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

【讨论】:

  • 您也可以git clone Linux 系统上的 repo,重命名文件并仅针对这种情况提交它们(如果您手头有 Linux 系统)。
  • 实际上,OS X 上的文件系统可以区分大小写,您可以在安装时对其进行配置。 How to check if an OS X partition is case-sensitive
  • ...因此答案中的“(默认情况下)”。
  • 确认,可以使用git rm --cached fileorfolder从git中删除文件或文件夹,而不需要从文件系统中删除文件或文件夹。然后您可以简单地使用git add fileorfolder 再次添加文件或文件夹。
【解决方案5】:

在 git config 中将 ignorecase 设置为 false

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

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

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

git config --global --get core.ignorecase

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

git config --global core.ignorecase false

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

作为建议,如果您正在处理多语言项目,并且您认为 Git 不应将所有项目视为区分大小写,只需更新本地 core.ignorecase 文件即可。

【讨论】:

  • 如果git config --global --get core.ignorecase 没有返回任何东西。是true??因为在我将其设置为 false 后它返回 false (Windows 10)
  • 而且它似乎没有按预期工作。我的意思是桌面客户端看到更改,但提交/同步后,文件名在线保持不变!
  • 为我工作(对于多个文件比使用git mv 更好)。我还假设默认情况下它被认为是真的(即它忽略大小写)。要么这样,要么它与操作系统的文件名大小写策略相匹配。
  • 这应该是选择的答案
  • 更改全局设置可能不起作用,因为本地设置会覆盖它。如果它不适合您,请检查两者。
【解决方案6】:

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

【讨论】:

  • 好像应该改成false这样git才会区分大小写?
  • 是的,没错。我个人有当 git 调用 smart 行为并尝试转换我的文件的行尾时。我目前非常讨厌一个糟糕的smart 功能,因为我主要在Windows 下为Linux 机器编写代码,所以我说checkout as is, commit as is
【解决方案7】:

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

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

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

【讨论】:

  • 它也适用于 git bash 中的 windows。谢谢你为我节省了很多时间! :)
  • @VincentGagnon 很高兴听到!用该信息更新了答案。
【解决方案8】:

VoncAnswer 是完全正确的,但仍有可能出现您的重命名操作不适用于 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】:

这个 Python sn-p 将 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)

【讨论】:

    【解决方案10】:

    工作示例:

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

    【讨论】:

    • 您的回答没有解决原来的问题。您正在对扩展进行小写
    • 我正在看这个,但要查看 500 张图像。我想在 git 上将 ./src/images/TESTIMAGE.png 重命名为 ./src/images/testimage.png
    【解决方案11】:

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

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

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

    现在一切都按预期进行。

    基于这个答案:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-23
      • 2022-01-11
      • 2016-06-08
      相关资源
      最近更新 更多