threads / discuss / 39249

Case rename not detected

Subject: Case rename not detected

## tl;dr

4 messages between May 5, 2015 and May 6, 2015.

replies: 3people: 3as markdown or json

Orgad Shaneh· May 5, 2015, 05:52 UTC · lore
Hi,

File case rename is not detected correctly on case-insensitive filesystems. git mv does support it though.

Example:

git init echo hello > foo git add foo git commit -m initial mv foo Foo git status # No changes git add . -A # Doesn't add anything

- Orgad
Junio C Hamano· May 5, 2015, 06:17 UTC · re: Orgad Shaneh · lore

Re: Case rename not detected

Orgad Shaneh <orgads@gmail.com> writes:
> File case rename is not detected correctly on case-insensitive
> filesystems. git mv does support it though.

It is a very much deliberate design decision to keep the case recorded in the index on case insensitive filesystems, where people can screw up the case of files they obtained from the project without even meaning to do so, as these filesystems and tools on them can carelessly change cases---after all, the case doesn't matter to these tools, but the people who interact with your work result via Git do---so we trust what Git initially gave you (e.g. via "checkout") more than the filesystem.

To effect the same as "git mv" at the end-user level, you would need to remove the entry from the index and re-add it. I.e.

Show 6 quoted lines
> git init
> echo hello > foo
> git add foo
> git commit -m initial
> mv foo Foo
> git status # No changes

git rm --cached foo ;# Foo should also work here, I think git add Foo ;# you should not say 'foo' here

> git add . -A # Doesn't add anything
>
> - Orgad
Orgad Shaneh· May 5, 2015, 06:27 UTC · re: Junio C Hamano · lore

Re: Case rename not detected

Thanks for the fast response!
On Tue, May 5, 2015 at 9:17 AM, Junio C Hamano <gitster@pobox.com> wrote:
Show 13 quoted lines
> Orgad Shaneh <orgads@gmail.com> writes:
>
>> File case rename is not detected correctly on case-insensitive
>> filesystems. git mv does support it though.
>
> It is a very much deliberate design decision to keep the case
> recorded in the index on case insensitive filesystems, where people
> can screw up the case of files they obtained from the project
> without even meaning to do so, as these filesystems and tools on
> them can carelessly change cases---after all, the case doesn't
> matter to these tools, but the people who interact with your work
> result via Git do---so we trust what Git initially gave you
> (e.g. via "checkout") more than the filesystem.

Can you name tools that change file case without notifying the user? I'm not aware of any.

Show 13 quoted lines
>
> To effect the same as "git mv" at the end-user level, you would need
> to remove the entry from the index and re-add it.  I.e.
>
>> git init
>> echo hello > foo
>> git add foo
>> git commit -m initial
>> mv foo Foo
>> git status # No changes
>
> git rm --cached foo ;# Foo should also work here, I think
> git add Foo ;# you should not say 'foo' here

This is very involved, and the user must be aware of the rename while committing. I usually trust git to find differences on its own, without needing my help.

We ran into this problem with a real project, which is mostly developed on Windows machines, but built on linux, where case matters.

One file was committed as Foo.cpp on the filesystem but as foo.cpp in the Makefile. Then in a subsequent commit it was supposed to be renamed foo.cpp, but it wasn't due to this bug.

- Orgad
Torsten Bögershausen· May 6, 2015, 20:00 UTC · re: Orgad Shaneh · lore

Re: Case rename not detected

On 2015-05-05 08.27, Orgad Shaneh wrote:
Show 30 quoted lines
> Thanks for the fast response!
> 
> On Tue, May 5, 2015 at 9:17 AM, Junio C Hamano <gitster@pobox.com> wrote:
>> Orgad Shaneh <orgads@gmail.com> writes:
>>
>>> File case rename is not detected correctly on case-insensitive
>>> filesystems. git mv does support it though.
>>
>> It is a very much deliberate design decision to keep the case
>> recorded in the index on case insensitive filesystems, where people
>> can screw up the case of files they obtained from the project
>> without even meaning to do so, as these filesystems and tools on
>> them can carelessly change cases---after all, the case doesn't
>> matter to these tools, but the people who interact with your work
>> result via Git do---so we trust what Git initially gave you
>> (e.g. via "checkout") more than the filesystem.
> 
> Can you name tools that change file case without notifying the user?
> I'm not aware of any.
> 
>>
>> To effect the same as "git mv" at the end-user level, you would need
>> to remove the entry from the index and re-add it.  I.e.
>>
>>> git init
>>> echo hello > foo
>>> git add foo
>>> git commit -m initial
>>> mv foo Foo
>>> git status # No changes

You can use git -c core.ignorecase=false status

It will report Foo as untracked

foo is not reported as missing, because the underlying OS says "foo" is there when Git does a stat("Foo")

← back to recent threads