如何在Git中应用包含文件名大小写更改的补丁?

7
我已经创建了一个补丁,它包含一个文件名的大小写更改:
git mv -f confvars.sh ConfVars.sh
git commit -am 'test filename case change'
git format-patch -M -1 HEAD

但是当我尝试应用该补丁时,出现了一个错误:
git apply 0001-test-filename-case-change.patch
> error: ConfVars.sh: already exists in working directory

如何在不出错的情况下应用此补丁?
**编辑**
为了澄清上面的例子:在应用补丁时,ConfVars.sh 文件不存在,而 confvars.sh 文件存在,我期望将其重命名,但它显示了上述错误。

看起来你正在尝试将补丁应用到一个已经包含该提交的存储库中,或者 ConfVars.sh 文件可能是由不同的提交创建的,或者存在于你的工作目录中未暂存或未提交的更改中... - twalberg
1
我认为我不是 - 这种行为与状态无关,旨在以通用格式询问如何应用补丁中给出的文件名大小写更改。为了澄清上面的例子,文件ConfVars.sh不存在 - 只有文件confvars.sh存在,我希望将其重命名,但它显示了上述错误。 - Martyn
这是什么平台?您是否实际上拥有一个区分大小写的文件系统(例如Linux),还是像NTFS/FAT(例如Windows)一样不区分大小写的文件系统? - twalberg
你是否设置了 core.ignorecase?请运行 git config --get core.ignorecase 和/或 git config --global --get core.ignorecase 进行检查... - twalberg
对我来说也是同样的问题。在设置了 git config core.ignorecase false(之前是 true)之后,我尝试应用补丁,但仍然遇到相同的错误,所以似乎设置 core.ignorecase 并没有起到作用。 - undefined
2个回答

5

这似乎是git-apply中的一个错误,它无法处理大小写不敏感的文件系统上的更名。不幸的是,即使补丁包含内容的添加和删除,而不仅仅是重命名,情况仍然如此。(因此,省略-M标志对于git-format-patch也没有帮助。)

看起来你有三个选择,取决于你想要承受的痛苦程度:

  1. 在区分大小写的文件系统上应用补丁,并将结果提交到你的代码库。
  2. 手动编辑补丁,将结果文件名更改为在你的代码库中明确区分的名称(例如TEMPORARY-FILE-CHANGE-ME),然后在应用补丁后将文件重命名为你想要的名称。
  3. 报告此错误,并希望有人真正关心并在你放弃手动更改代码库之前修复它。

话虽如此,我没有注意到你的评论是关于Linux的;在区分大小写的文件系统上,更改大小写的重命名对我来说似乎是可以工作的。 你使用的是不区分大小写的文件系统吗?USB闪存或其他什么东西吗? - Edward Thomson

2

如果您正在运行Windows 10(>= 1803,2018年4月),您可以通过输入以下命令(可能需要管理员权限)启用NTFS大小写敏感性:

fsutil.exe file setCaseSensitiveInfo C:\SampleFolder enable

现在git apply命令应该可以正常工作了。

备注:现有的子文件夹不受影响。


这也需要使用WSL。 - undefined

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