文件夹大小写在分支开关上没有改变

Folder capitalization not changing on branch switch

我正在做一个 python 项目,想将一个(包)文件夹重命名为小写字母,比方说从 Myackagemypackage。由于 git 区分大小写而 Windows 不区分大小写,因此我遵循了 here and espacially here.

中的解决方案

我的程序如下:

git mv Mypackage tmp
git mv tmp mypackage
git commit -m "Change capitalization of package name"

这会将文件夹 Myackage 成功更改为 mypackage(对于 git 和 Windows)。但是,如果我切换到另一个分支,我希望该文件夹像以前一样改回 Mypackage(大写字母!)。背景是,包的所有导入在 python 中也是区分大小写的,我需要这个重命名伴随着导入的适应。

我都试过了,core.ignorecase 设置为 truefalse,但无论我尝试什么,如果我检出一个较旧的分支,该文件夹的形式仍然是小写字母 (mypackage) 和我 运行 内的问题 python.

更新: 我已经建立了一个只有一个文件夹和一个文件的小例子,并且可以成功地改变文件夹的大小写。它还显示了所需的行为,即在分支切换时 Windows 中文件夹的大小写发生变化,但这仍然不适用于我的 python 项目。

会不会是,例如,子模块在这里发挥作用?

更新 2: 我已经通过以下方式检查了两种情况的 case sensitivity 属性:

fsutil.exe file queryCaseSensitiveInfo .

两个文件夹都声称,区分大小写已停用。仍然对于一个项目文件夹名称大小写更改,但对于另一个文件夹不是。

我找到了重现您的行为的方法:

如果我的 CaSeD 文件夹包含一些额外的文件(例如未跟踪的文件),git 将不会在我在提交之间跳转时更改我的文件夹名称的大小写。

您的设置是否属于这种情况?


如果这是您的问题:您可以使用 post-checkout 挂钩,它会在结帐后根据存储在 HEAD 中的内容强制重命名文件夹。

从提交 HEAD 获取目录路径的完整列表的一种方法是:

git ls-tree --name-only -d -r HEAD

如果您将此列表与从本地文件系统中提取的类似列表匹配(ls -rfind . -type dos.* 中的某些 python 函数?),您可以发现哪些文件夹需要资本重组。

属性 case sensitivity 在 Windows 10 上可用,但在 2018 年 4 月更新之后并且仅影响您应用它的特定文件夹。它不会被该文件夹的子文件夹自动继承。但是,如果您使用 WSL 创建文件夹,它默认处于启用状态,并且以这种方式可供 Windows 使用。 [1]

尽管您可以使用 Git Unite [2] 工具将当前文件夹的大小写与 git 索引相匹配。

如果您使用重命名方法,请尝试将其与 git 命令一起使用,例如 "Rename files and folders with git"[3]

git mv foldername tempname && git mv tempname folderName