GIT_ONE_FILESYSTEM: flip the default to stop at filesystem boundaries

Regarding the new environment variable, Linus Torvalds
<torvalds@linux-foundation.org> writes on Tue, 30 Mar 2010 in
<alpine.LFD.2.00.1003301537150.3707@i5.linux-foundation.org>:

    I suspect that it is _very_ unusual to have a source repo that crosses
    multiple filesystems, and the original reason for this patch-series
    seems to me to be likely to be more common than that multi-fs case. So
    having the logic go the other way would seem to match the common case,
    no?

The "crossing filesystem boundary" condition is checked by comparing
st_dev field in the result from stat(2).  This is slightly worrysome if
non-POSIX ports return different values in the field even for directories
in the same work tree extracted to the same "filesystem".  Erik Faye-Lund
confirms that in the msysgit port st_dev is 0, so this should be safe, as
"even Windows is safe" ;-)

This will affect those who use /.git to cram /etc and /home/me in the same
repostiory, /home is mounted from non-root filesystem, and a git operation
is done from inside /home/me/src.  But that is such a corner case we don't
want to give preference over helping people who will benefit from having
this default so that they do not have to suffer from slow automounters.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano 2010-04-04 10:33:53 -07:00
Родитель 8030e44215
Коммит e640551773
2 изменённых файлов: 10 добавлений и 6 удалений

Просмотреть файл

@ -531,10 +531,14 @@ git so take care if using Cogito etc.
(Useful for excluding slow-loading network directories.)
'GIT_ONE_FILESYSTEM'::
If set to a true value ("true" or a non-zero integer), stop at
filesystem boundaries when looking for a repository directory.
Like 'GIT_CEILING_DIRECTORIES', it will not affect an explicit
respository directory set via 'GIT_DIR' or on the command line.
When run in a directory that does not have ".git" repository
directory, git tries to find such a directory in the parent
directories to find the top of the working tree, but by default it
does not cross filesystem boundaries. This environment variable
can be set to false value ("false" or zero) to tell git not to
stop at filesystem boundaries. Like 'GIT_CEILING_DIRECTORIES',
this will not affect an explicit respository directory set via
'GIT_DIR' or on the command line.
git Commits
~~~~~~~~~~~

Просмотреть файл

@ -323,7 +323,7 @@ const char *setup_git_directory_gently(int *nongit_ok)
const char *gitdirenv;
const char *gitfile_dir;
int len, offset, ceil_offset, root_len;
int current_device = 0, one_filesystem = 0;
int current_device = 0, one_filesystem = 1;
struct stat buf;
/*
@ -444,7 +444,7 @@ const char *setup_git_directory_gently(int *nongit_ok)
}
cwd[offset] = '\0';
die("Not a git repository (or any parent up to mount parent %s)\n"
"Stopping at filesystem boundary since GIT_ONE_FILESYSTEM is set.", cwd);
"Stopping at filesystem boundary since GIT_ONE_FILESYSTEM is true.", cwd);
}
}
if (chdir("..")) {