如何在Windows上使用Git解决文件夹大小写冲突?

11
我正在执行 git rebase,但卡住了,因为一个提交中有一个名为 Proto 的文件夹,而另一个提交中有一个名为 proto 的文件夹。这是一个诚实的错误,应该在两种情况下都是Proto。 我能想到的最好方法是尝试从两个提交中删除文件夹,然后再尝试rebase,但肯定有更好的方法。
以前,当我遇到文件名称大小写问题时,我使用 git mv 命令,但对于文件夹,它不允许我运行 git mv命令,我不知道为什么。
在Windows上,如何正确解决git中文件夹名称大小写问题?
5个回答

18

当大量文件移动到不同目录时,我们在 Windows 上的 git 仓库中遇到了类似的问题。

我第一次手动解决了我们的问题,将仓库克隆到 Linux VM 中,并运行一个 bash 脚本,其中包含 git mv 命令来修复文件路径大小写问题。这是一个痛苦的过程,所以我决定开发一个实用程序来自动化这个过程。

Git Unite 是一个使用 libgit2sharp 库编写的 .NET 控制台应用程序。该程序识别所有具有与 Windows 文件系统报告的文件路径大小写不同的 git 索引条目。

我撰写了一篇博客文章,详细介绍了工具、用法和背后的历史:Git Unite - 解决 Windows 上大小写敏感的文件路径问题


1
非常感谢这个工具!它节省了我们几个小时手动修复混乱的代码库。 - Michael Benford
非常感谢你,这对我们来说非常有帮助!它是有效且易于使用的。 - Felipe Skinner

1

将文件夹重命名并添加到Git历史记录中是困难的,因为只有文件被跟踪,而不是文件夹。假设您想将oldFolder重命名为oldfolder,您可以尝试以下操作:

  1. 从您第一次在oldFolder中创建文件的位置开始交互式地变基。编辑每个添加文件到此文件夹的提交。当交互式变基停止时,创建newFolder并执行git mv oldFolder/* newFolder/。对于每个交互式变基的停止点都要执行此操作。

  2. 显然,在Windows中,您不能将oldFoldernewFolder作为同一个单词的两个不同大小写版本。因此,请重复步骤1,将newFolder重命名为oldfolder


感谢您的帮助,事实证明我必须返回并从一个分支中删除文件夹,执行rebase,然后在rebase之后手动将文件添加回去。 - Jonathan Beerhalter

0

这能重写历史记录以更正大小写吗? - krlmlr

0
我怀疑您需要将文件夹中的每个文件“git mv”到一个临时名称,如'ProtoX',然后将具有临时命名的文件“git mv”到“Proto”,因为Git仅跟踪文件而不是文件夹本身。
双重“git mv”解决了Windows大小写不敏感的文件系统问题。(在区分大小写的文件系统(如Linux)上,您应该能够直接从“proto”移动到“Proto”。)

0

不必在每个文件上使用git mv或外部工具,你可以通过以下方法欺骗git来进行重命名操作的暂存:

  1. 将文件夹重命名为一个明显不同的名称,比如"Proto_X"
  2. 暂存父级文件夹,git add .
  3. 将文件夹重命名为所需的名称,包括大小写,比如"Proto"
  4. 再次暂存父级文件夹,git add .

这样做的原因是暂存操作是确定大小写差异的地方。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接