[RFC] Case insensitive Git attributes

8 messages, 5 authors, 2016-10-17 · open the first message on its own page

[RFC] Case insensitive Git attributes

From: Lars Schneider <hidden>
Date: 2016-10-17 01:04:40

Hi,

Git attributes for path names are generally case sensitive. However, on 
a case insensitive file system (e.g. macOS/Windows) they appear to be
case insensitive (`*.bar` would match `foo.bar` and `foo.BAR`). That 
works great until a Git users joins the party with a case sensitive file 
system. For this Git user only files that match the exact case of the 
attribute pattern get the attributes (only `foo.bar`).

This inconsistent behavior can confuse Git users. An advanced Git user
could use a glob pattern (e.g. `*.[bB][aA][rR]) to match files in a
case insensitive way. However, this can get confusing quickly, too.

I wonder if we can do something about this. One idea could be to add an
attribute "case-sensitive" (or "caseSensitive") and set it to false 
(if desired) for all files in .gitattributes for a given repo.

### .gitattributes example ###

* case-sensitive=false
*.bar something

###

I haven't looked into the feasibility of an implementation, yet. However,
would that be an acceptable approach?

Thanks,
Lars


Re: [RFC] Case insensitive Git attributes

From: Stefan Beller <hidden>
Date: 2016-10-17 03:07:53

On Sun, Oct 16, 2016 at 6:04 PM, Lars Schneider
[off-list ref] wrote:
Hi,

Git attributes for path names are generally case sensitive. However, on
a case insensitive file system (e.g. macOS/Windows) they appear to be
case insensitive (`*.bar` would match `foo.bar` and `foo.BAR`). That
works great until a Git users joins the party with a case sensitive file
system. For this Git user only files that match the exact case of the
attribute pattern get the attributes (only `foo.bar`).

This inconsistent behavior can confuse Git users. An advanced Git user
could use a glob pattern (e.g. `*.[bB][aA][rR]) to match files in a
case insensitive way. However, this can get confusing quickly, too.

I wonder if we can do something about this. One idea could be to add an
attribute "case-sensitive" (or "caseSensitive") and set it to false
(if desired) for all files in .gitattributes for a given repo.
FYI: I am currently refactoring the attr subsystem (e.g.
https://public-inbox.org/git/20161012224109.23410-1-sbeller@google.com/
"attr: convert to new threadsafe API")
### .gitattributes example ###

* case-sensitive=false
Would this modify the current file only or the whole stack of attrs?
(In just one way or the whole stack, i.e. can you add this in .git/info/exclude
and the attribute file in the home dir also behaves differently? Or rather the
other way round when the system wide attr file enables case insensitivity,
each repository local config is set automatically? both ways?)
*.bar something

###

I haven't looked into the feasibility of an implementation, yet. However,
would that be an acceptable approach?
Conceptually I would prefer if we had a single switch that indicates a
case insensitive FS. That could be used for different purposes as well,
that are FS relevant such as checking in, checking out/renaming files
in the working tree? (does any such switch already exist for case
sensitivity?)

Thanks,
Stefan
Thanks,
Lars

Re: [RFC] Case insensitive Git attributes

From: Torsten Bögershausen <hidden>
Date: 2016-10-17 04:25:03


On 17/10/16 05:07, Stefan Beller wrote:
On Sun, Oct 16, 2016 at 6:04 PM, Lars Schneider
[off-list ref] wrote:
quoted
Hi,

Git attributes for path names are generally case sensitive. However, on
a case insensitive file system (e.g. macOS/Windows) they appear to be
case insensitive (`*.bar` would match `foo.bar` and `foo.BAR`).
This feels like a bug:

$ git diff
diff --git a/.gitattributes b/.gitattributes
index 5e98806..1419867 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,3 +1,4 @@
  * whitespace=!indent,trail,space
  *.[ch] whitespace=indent,trail,space
  *.sh whitespace=indent,trail,space
+*.C text

-----------
$ git -c core.ignorecase=false check-attr --all git.c
git.c: whitespace: indent,trail,space

#But running on a case insensitve FS I get:
$ git  check-attr --all git.c
git.c: text: set
git.c: whitespace: indent,trail,space

quoted
That
works great until a Git users joins the party with a case sensitive file
system. For this Git user only files that match the exact case of the
attribute pattern get the attributes (only `foo.bar`).

This inconsistent behavior can confuse Git users. An advanced Git user
could use a glob pattern (e.g. `*.[bB][aA][rR]) to match files in a
case insensitive way. However, this can get confusing quickly, too.

I wonder if we can do something about this. One idea could be to add an
attribute "case-sensitive" (or "caseSensitive") and set it to false
(if desired) for all files in .gitattributes for a given repo.
FYI: I am currently refactoring the attr subsystem (e.g.
https://public-inbox.org/git/20161012224109.23410-1-sbeller@google.com/
"attr: convert to new threadsafe API")
quoted
### .gitattributes example ###

* case-sensitive=false
How about
* ignorecase=true
  ?
Would this modify the current file only or the whole stack of attrs?
(In just one way or the whole stack, i.e. can you add this in .git/info/exclude
and the attribute file in the home dir also behaves differently? Or rather the
other way round when the system wide attr file enables case insensitivity,
each repository local config is set automatically? both ways?)
quoted
*.bar something

###

I haven't looked into the feasibility of an implementation, yet. However,
would that be an acceptable approach?
Conceptually I would prefer if we had a single switch that indicates a
case insensitive FS. That could be used for different purposes as well,
that are FS relevant such as checking in, checking out/renaming files
in the working tree? (does any such switch already exist for case
sensitivity?)

Thanks,
Stefan
quoted
Thanks,
Lars


Re: [RFC] Case insensitive Git attributes

From: Johannes Schindelin <hidden>
Date: 2016-10-17 08:56:04

Hi Lars,

On Sun, 16 Oct 2016, Lars Schneider wrote:
One idea could be to add an attribute "case-sensitive" (or
"caseSensitive") and set it to false (if desired) for all files in
.gitattributes for a given repo.

### .gitattributes example ###

* case-sensitive=false
*.bar something

###
Hrm. Maybe a better idea would be to warn when attributes match a file
name with a different case?

Ciao,
Dscho

Re: [RFC] Case insensitive Git attributes

From: Johannes Schindelin <hidden>
Date: 2016-10-17 08:57:58

Hi Stefan,

On Sun, 16 Oct 2016, Stefan Beller wrote:
Conceptually I would prefer if we had a single switch that indicates a
case insensitive FS.
AFAIU Lars' use case is where the FS is *case sensitive*, but he still
needs the .gitattributes to be *case insensitive* because that file
originates from a developer with such a file system.

Otherwise he would simply tack onto the core.ignoreCase flag.

Ciao,
Dscho

Re: [RFC] Case insensitive Git attributes

From: Duy Nguyen <hidden>
Date: 2016-10-17 09:13:13

On Mon, Oct 17, 2016 at 3:57 PM, Johannes Schindelin
[off-list ref] wrote:
Hi Stefan,

On Sun, 16 Oct 2016, Stefan Beller wrote:
quoted
Conceptually I would prefer if we had a single switch that indicates a
case insensitive FS.
AFAIU Lars' use case is where the FS is *case sensitive*, but he still
needs the .gitattributes to be *case insensitive* because that file
originates from a developer with such a file system.

Otherwise he would simply tack onto the core.ignoreCase flag.
That sounds to me like setting core.ignoreCase to true (on all devs'
repo) would "solve" this. Yes core.ignoreCase may introduce some side
effects when used on case-sensitive filesystems, so we probably want
something in the same spirit but limited to .gitattributes and
.gitignore only.
-- 
Duy

Re: [RFC] Case insensitive Git attributes

From: Johannes Schindelin <hidden>
Date: 2016-10-17 10:46:31

Hi Duy,

On Mon, 17 Oct 2016, Duy Nguyen wrote:
On Mon, Oct 17, 2016 at 3:57 PM, Johannes Schindelin
[off-list ref] wrote:
quoted
Hi Stefan,

On Sun, 16 Oct 2016, Stefan Beller wrote:
quoted
Conceptually I would prefer if we had a single switch that indicates a
case insensitive FS.
AFAIU Lars' use case is where the FS is *case sensitive*, but he still
needs the .gitattributes to be *case insensitive* because that file
originates from a developer with such a file system.

Otherwise he would simply tack onto the core.ignoreCase flag.
That sounds to me like setting core.ignoreCase to true (on all devs'
repo) would "solve" this.
It is good that you quoted this verb, because it does not solve things.
Instead, it would try to use the flag for two slightly incompatible
purposes at the same time.

The first (and so far, only) purpose is to tell Git that the current file
system is case insensitive.

The new purpose you described would be to tell Git that the *user* does
not care about the file names' case, even if the file system does.

I do not think that this leads to a better situation than before. Instead,
I am convinced that it will cause new and sometimes "entertaining"
problems because you can no longer discern between those two purposes
based on core.ignoreCase, you would have to teach Git to test every single
time whether the file system is case-sensitive or not.

Needless to say, I'd rather not see that happening. Many users, including
my colleagues and myself, rely on Git being a rock solid piece of
software, and that change would make it less so.

Ciao,
Dscho

Re: [RFC] Case insensitive Git attributes

From: Duy Nguyen <hidden>
Date: 2016-10-17 11:03:26

On Mon, Oct 17, 2016 at 5:46 PM, Johannes Schindelin
[off-list ref] wrote:
Hi Duy,

On Mon, 17 Oct 2016, Duy Nguyen wrote:
quoted
On Mon, Oct 17, 2016 at 3:57 PM, Johannes Schindelin
[off-list ref] wrote:
quoted
Hi Stefan,

On Sun, 16 Oct 2016, Stefan Beller wrote:
quoted
Conceptually I would prefer if we had a single switch that indicates a
case insensitive FS.
AFAIU Lars' use case is where the FS is *case sensitive*, but he still
needs the .gitattributes to be *case insensitive* because that file
originates from a developer with such a file system.

Otherwise he would simply tack onto the core.ignoreCase flag.
That sounds to me like setting core.ignoreCase to true (on all devs'
repo) would "solve" this.
It is good that you quoted this verb, because it does not solve things.
Instead, it would try to use the flag for two slightly incompatible
purposes at the same time.

The first (and so far, only) purpose is to tell Git that the current file
system is case insensitive.

The new purpose you described would be to tell Git that the *user* does
not care about the file names' case, even if the file system does.

I do not think that this leads to a better situation than before. Instead,
I am convinced that it will cause new and sometimes "entertaining"
problems because you can no longer discern between those two purposes
based on core.ignoreCase, you would have to teach Git to test every single
time whether the file system is case-sensitive or not.
I agree. Which is why I wrote "we probably want something in the same
spirit but limited to .gitattributes and .gitignore only". In other
words we could have core.someName that makes .gitattributes and
.gitignore patterns case-insensitive (or core-sensitive). If it's
present, it overrides core.ignoreCase. If it's not present,
core.ignoreCase decides. I'm just not sure if the new config should
cover everything involving filename's case in git. That's too big to
fit in my head.
Needless to say, I'd rather not see that happening. Many users, including
my colleagues and myself, rely on Git being a rock solid piece of
software, and that change would make it less so.
-- 
Duy
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help