From: Linus Torvalds <torvalds@linux-foundation.org>
To: Junio C Hamano <gitster@pobox.com>,
Git Mailing List <git@vger.kernel.org>
Cc: Frank <streamlake@tiscali.it>, Dmitry Potapov <dpotapov@gmail.com>
Subject: [PATCH 0/7] Case-insensitive filesystem support, take 1
Date: Sat, 22 Mar 2008 10:21:05 -0700 (PDT) [thread overview]
Message-ID: <alpine.LFD.1.00.0803220955140.3020@woody.linux-foundation.org> (raw)
Ok, so I said it wasn't a high priority, but I had already done all the
really core support for this in that we have the name hashes now that I
wanted to use for looking up names case-insensitively, so I took it as a
challenge to do this cleanly. I already knew how I wanted to do it, so how
hard could it be?
First, a few caveats:
- I've tested this series, both on a case-sensitive one (using hardlinks
to test corner cases) and on a vfat filesystem under Linux (which is
case-insensitive and *really* odd wrt case preservation - it remembers
the name of removed files, so it preserves case even across removal and
re-creation!)
- HOWEVER. The testing has been very targeted, and I only convered a few
cases to really care. Things like case-renaming, for example, will be
trivial to do, but I didn't do it. So if you want to do a
git mv Abc abc
on a case-insensitive filesystem, you currently still have to do it as
the sequence
git mv Abc xyz
git mv xyz abc
because I did *not* make git-mv know about case-insensitivity.
- The only two operations that care about case-insensitivity after this
series of seven patches are
(a) "git status" and friends (like "git add") that use the directory
traversal code will know to ignore files that have a case-
insensitive version in the index. So if you have messed up the
case in the working tree (or the filesystem isn't even case-
preserving), then "git add" and "git status" won't show the
case-different file as being "unknown".
(b) merging trees (git read-tree) knows about unexpectedly found files
that are due to case-insensitive filesystems, and knows to ignore
them. This means that switching branches where the case of a file
changes works, and it means that going a merge across that case
also works.
- I made this all conditional on
[core]
ignorecase = true
because obviously I'm not at all interested in penalizing sane
filesystems. That said, I also worked at trying to make sure that it's
safe and possible to do this on a case-sensitive filesystem in case you
are working on a project that doesn't like case-sensitivity, so the
"git status" and "git add ." kind of operations won't add aliases
- Finally: the "case independence" rules could be anything, but right now
I *only* do the standard US-ASCII versions. This will *not* help with
the insane OS X cases of UTF-8 normalization: to actually get that you
need to make sure that the hash-function for names and the comparison
functions work correctly with those more complex cases.
So _conceptually_ this should all work for UTF-8 normalization 'case'
insensitivity too or on just generally utf-8 cases, but I didn't
actually do that more complex case. That's a separate area, and will
not affect the core logic.
And then one final caveat: I think the patch-series is fairly clean, and
each patch in itself is pretty simple, but my testing has been limited,
and not only haven't I extended the case-insensitivity to all operations,
but I would suggest some care from people who test this.
But if you care about the crazy OS X UTF-8 normalization (which apparently
can happen even on otherwise case-sensitive filesystems), or if you care
about the more regular case insensitivity of HFS+ or Windows, you need to
test this - even if you tests right now should be limited to US-ASCII
only. Because I'll happily fix issues, but I'm not using those crap
filesystems myself, nor will I be doing any more testing on VFAT unless
people actually point out issues to me.
So it's up to you users of crap OS's to test the cases and make good
reports, and I'll care just because I think it's a somewhat interesting
problem (it's why I did this series), but I'll never do anything about
this without prodding and good reports. Ok?
Junio: I think this is safe, if only because it's all so very
straight-forward, and I tried very hard to make each change trivial and
limited and fairly easy to understand. Some of the patches are pure
cleanups that I hit when looking at the code and wanted to fix before I
even made any other changes.
Linus
next reply other threads:[~2008-03-22 17:22 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-22 17:21 Linus Torvalds [this message]
2008-03-22 17:22 ` [PATCH 1/7] Make unpack_trees_options bit flags actual bitfields Linus Torvalds
2008-03-22 17:25 ` [PATCH 2/7] Move name hashing functions into a file of its own Linus Torvalds
2008-03-22 17:28 ` [PATCH 3/7] Make "index_name_exists()" return the cache_entry it found Linus Torvalds
2008-03-22 17:30 ` [PATCH 4/7] Make hash_name_lookup able to do case-independent lookups Linus Torvalds
2008-03-22 17:33 ` [PATCH 5/7] Add 'core.ignorecase' option Linus Torvalds
2008-03-22 17:38 ` [PATCH 6/7] Make branch merging aware of underlying case-insensitive filsystems Linus Torvalds
2008-03-22 17:45 ` [PATCH 7/7] Make unpack-tree update removed files before any updated files Linus Torvalds
2008-03-22 18:06 ` [PATCH 0/7] Final words Linus Torvalds
2008-03-22 18:28 ` Linus Torvalds
2008-03-22 21:19 ` [PATCH 8/7] When adding files to the index, add support for case-independent matches Linus Torvalds
2008-03-22 21:22 ` [PATCH 9/7] Make git-add behave more sensibly in a case-insensitive environment Linus Torvalds
2008-03-23 5:49 ` [PATCH 7/7] Make unpack-tree update removed files before any updated files Junio C Hamano
2008-03-23 6:13 ` [PATCH 6/7] Make branch merging aware of underlying case-insensitive filsystems Junio C Hamano
2008-03-23 15:41 ` Linus Torvalds
2008-03-22 17:36 ` [PATCH 1/7] Make unpack_trees_options bit flags actual bitfields Johannes Schindelin
2008-03-22 17:47 ` Linus Torvalds
2008-03-22 17:57 ` Johannes Schindelin
2008-03-22 22:01 ` [PATCH] t0050: Set core.ignorecase case to activate case insensitivity Steffen Prohaska
2008-03-25 6:57 ` [PATCH] git-init: autodetect core.ignorecase Dmitry Potapov
2008-03-25 9:59 ` Johannes Schindelin
2008-03-25 10:49 ` [PATCH v2] " Dmitry Potapov
2008-03-25 11:03 ` [PATCH] " Dmitry Potapov
2008-03-25 8:14 ` [PATCH 0/7] Case-insensitive filesystem support, take 1 Dmitry Potapov
2008-03-25 21:04 ` Linus Torvalds
2008-03-26 2:46 ` Dmitry Potapov
2008-03-26 3:37 ` Linus Torvalds
2008-03-25 11:39 ` Derek Fawcus
2008-03-25 18:26 ` Jan Hudec
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.LFD.1.00.0803220955140.3020@woody.linux-foundation.org \
--to=torvalds@linux-foundation.org \
--cc=dpotapov@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=streamlake@tiscali.it \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).