• J
    mingw: introduce the 'core.hideDotFiles' setting · f30afdab
    Johannes Schindelin 提交于
    On Unix (and Linux), files and directories whose names start with a dot
    are usually not shown by default. This convention is used by Git: the
    .git/ directory should be left alone by regular users, and only accessed
    through Git itself.
    
    On Windows, no such convention exists. Instead, there is an explicit flag
    to mark files or directories as hidden.
    
    In the early days, Git for Windows did not mark the .git/ directory (or
    for that matter, any file or directory whose name starts with a dot)
    hidden. This lead to quite a bit of confusion, and even loss of data.
    
    Consequently, Git for Windows introduced the core.hideDotFiles setting,
    with three possible values: true, false, and dotGitOnly, defaulting to
    marking only the .git/ directory as hidden.
    
    The rationale: users do not need to access .git/ directly, and indeed (as
    was demonstrated) should not really see that directory, either. However,
    not all dot files should be hidden by default, as e.g. Eclipse does not
    show them (and the user would therefore be unable to see, say, a
    .gitattributes file).
    
    In over five years since the last attempt to bring this patch into core
    Git, a slightly buggy version of this patch has served Git for Windows'
    users well: no single report indicated problems with the hidden .git/
    directory, and the stream of problems caused by the previously non-hidden
    .git/ directory simply stopped. The bugs have been fixed during the
    process of getting this patch upstream.
    
    Note that there is a funny quirk we have to pay attention to when
    creating hidden files: we use Win32's _wopen() function which
    transmogrifies its arguments and hands off to Win32's CreateFile()
    function. That latter function errors out with ERROR_ACCESS_DENIED (the
    equivalent of EACCES) when the equivalent of the O_CREAT flag was passed
    and the file attributes (including the hidden flag) do not match an
    existing file's. And _wopen() accepts no parameter that would be
    transmogrified into said hidden flag. Therefore, we simply try again
    without O_CREAT.
    
    A slightly different method is required for our fopen()/freopen()
    function as we cannot even *remove* the implicit O_CREAT flag.
    Therefore, we briefly mark existing files as unhidden when opening them
    via fopen()/freopen().
    
    The ERROR_ACCESS_DENIED error can also be triggered by opening a file
    that is marked as a system file (which is unlikely to be tracked in
    Git), and by trying to create a file that has *just* been deleted and is
    awaiting the last open handles to be released (which would be handled
    better by the "Try again?" logic, a story for a different patch series,
    though). In both cases, it does not matter much if we try again without
    the O_CREAT flag, read: it does not hurt, either.
    
    For details how ERROR_ACCESS_DENIED can be triggered, see
    https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858Original-patch-by: NErik Faye-Lund <kusmabite@gmail.com>
    Initial-Test-By: NPat Thoyts <patthoyts@users.sourceforge.net>
    Signed-off-by: NJohannes Schindelin <johannes.schindelin@gmx.de>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    f30afdab
cache.h 64.4 KB