在不区分大小写的文件系统上自动 git 提交区分大小写的重命名

Automate git commit of case-sensitive rename on case-insensitve file system

我在一个不区分大小写的文件系统上(Windows)并且改变了几个文件的大小写(很多文件受到影响,所以我不急于再做)。

我预计提交更改会很容易。但是 git 不知道这些变化,所以我卡住了。

我的感觉是一定有办法告诉git:"Look at the names as they are currently stored on the disk. Commit them exactly like this, i.e. do git mv Foo foo if the case differs from the file in the index."

我已经安装了 TortoiseGit,但找不到这样的选项。我尝试设置 core.ignorecase = true 但这似乎没有任何区别。

谢谢, TF

IIRC core.ignorecase = true 在 git 个存储库 created/cloned 上自动设置为 true windows。

如果你想重命名文件,你可以使用上下文菜单 "Rename" 选项(你可能需要按住 Shift 键才能看到它 - 可在 TortoiseGit 选项中配置)以执行 git mv 操作.

再次调查我的问题后,我得出的结论是没有解决方案。我最终编写了一个批处理脚本来使用 git mv.

重命名我的文件

恕我直言,如果 Git 即使在不区分大小写的文件系统上也能处理区分大小写的文件,那么整个不区分大小写与区分大小写的问题就不会成为问题。当然你不能在 Windows 或 OS X 中将文件 "foo.txt" 放在 "Foo.TXT" 旁边,但是没有理由,为什么 Git 任性地忽略了差异Windows 或 OS X 重命名后(因为两个系统都很好地区分大小写)。

您可以将根文件夹重命名为 name_,提交,然后改回并提交。

这是可行的,因为当您将根文件夹从 name 更改为 name_ 时,它会删除 name 文件夹下的所有文件——小写和大写版本。

但是,这似乎会导致文件历史记录出现问题,即。 "Compare with last revision" 等命令无法找到最新修订版。 (因为您将它们全部重新定位到一次提交的不同路径)

您可以在此处尝试使用此实用程序:https://github.com/tawman/git-unite

(我还没有能够自己尝试,因为作者没有提供最终的 exe 文件,我在尝试 运行 构建脚本时遇到了问题。但似乎成为一个可以更轻松地解决此问题的实用程序。)

您需要获取 git 才能刷新 git 索引中的文件,但是,在大小写密集 OS 上,它不会接受区分大小写的更改。

相反,您可以强制它使用

更新索引
git rm -r --cached . 
git add .

下一步别忘了提交。

source

Venryx提供的解决方案很好。我能够按照 README.md 文件中的说明编译 Git-Unite 存储库,并在第 223 行的 UniteRepository.cs 文件中进行了一次更正: 将 _gitRepository?.Dispose(); 更改为 _gitRepository.Dispose();

获得可执行文件后,只需将其应用:git.unite.exe [OPTIONS] [repository_folder]。这非常有效。