git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Git apply fails on case-only rename on case-insensitive filesystem

From
brian m. carlson <sandals@crustytoothpaste.net>
Date
Jun 8, 2022, 22:27 UTC
Message-ID
<YqEiPf/JR/MEc3C/@camp.crustytoothpaste.net>
In-Reply-To
<CAPMMpojwV+f=z9sgc_GaUOTFBCUVdbrGW8WjatWWmC3WTcsoXw@mail.gmail.com>
On 2022-06-08 at 13:07:05, Tao Klerks wrote:
Show 19 quoted lines
> Hi folks,
> 
> I just found out that "git apply" has a faulty existence check on
> case-insensitive filesystems (or, at least, windows?).
> 
> Simplest repro I could come up with:
> 
> git init renamefun
> cd renamefun
> echo "Test" > file1
> git add .
> git commit -m "first commit"
> git mv file1 File1
> git commit -m "second commit"
> git checkout master~1
> git diff master~1..master | git apply
> 
> -> error:
> error: File1: already exists in working directory

Your problem here is that the file does already exist. To Windows "file1" and "File1" are the same file. Git wants to create the new file before deleting the old one, but it already exists.

Show 9 quoted lines
> (on linux, the same sequence of commands completes correctly)
> 
> I was able to work around this for my purposes by avoiding rename
> detection on the diff, and only passing the "Add" (and "Modify")
> operations through to the "apply", after having separately/manually
> handled the deletions.
> 
> Is this a known issue that someone might be working on, or worth
> digging into / trying to fix?

As I explained to someone else just today, the rules for case-folding on Windows differ based on the version of the tool that was used to format the file system and cannot be inspected without reading the raw file system. (This is also true of macOS.) Thus, we cannot know ahead of time whether two files differ only in case.

The way we could determine this on Unix would be to stat both files and compare device and inode data when we get EEXIST, but I don't think our Windows stat emulation supports that. Having said that, for case-insensitive macOS, I think the rename detection could be fixed here using that technique. I don't think anyone's working on such a thing at the moment, though.

-- 
brian m. carlson (he/him or they/them)
Toronto, Ontario, CA
Previous: Tao KlerksNext: Tao Klerks
Message 2 of 3 in “Git apply fails on case-only rename on case-insensitive filesystem”
  1. Tao KlerksJun 8, 2022
  2. brian m. carlsonJun 8, 2022
  3. Tao KlerksJun 9, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.