git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] GIT_ONE_FILESYSTEM: flip the default to stop at filesystem boundaries

From
Junio C Hamano <gitster@pobox.com>
Date
Apr 4, 2010, 18:00 UTC
Message-ID
<7v4ojr85ee.fsf_-_@alter.siamese.dyndns.org>
In-Reply-To
<40aa078e1003301754u3a1e5e9je7bb2aa2dc04f6a1@mail.gmail.com>

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>
---
 * I agree with Linus that it make sense to flip the default, but this
   should probably have to wait for at least two release cycles for the
   usual backward-compatibility rules.
   I wonder if "git add" and friends should also notice it and warn.  If
   you have more than one values of ce->ce_dev in the index, it means that
   the working tree spans more than one filesystem and from a subdirectory
   with an entry that has a ce->ce_dev different from the value for a path
   at the top of the work tree, you will not be able to discover the top
   of the tree without GIT_ONE_FILESYSTEM set to true.  A likely scenario
   for this to happen would be:
    (1) You have a tarball of some sort; you extract it $there;
	$ mkdir $there && cd $there
        $ tar xf /var/tmp/tarball.tar
    (2) You notice the filesystem lacks enough free space, and move some
        part (say "images/") to a separate filesystem, and bind-mount;
        $ mv images $another/. && rm -fr images && mkdir images
        $ mount --bind $another/images images
    (3) You add everything to start the project;
        $ git init && git add .
        Up to this point it would work (you are at the top of the working
        tree).  And this is the point we _could_ notice and warn that you
        will have trouble in step (4).
    (4) Go down to a subdirectory and start futzing;
	$ cd images && gimp naughty.jpg && git add -u
 Documentation/git.txt |   12 ++++++++----
 setup.c               |    4 ++--
 2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/Documentation/git.txt b/Documentation/git.txt
index bf1b45e..aa62083 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -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
 ~~~~~~~~~~~
diff --git a/setup.c b/setup.c
index 8b911b1..d290633 100644
--- a/setup.c
+++ b/setup.c
@@ -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("..")) {
-- 
1.7.0.4.552.gc303c1
Previous: Erik Faye-LundNext: Junio C Hamano
Message 17 of 20 in “Add support for GIT_ONE_FILESYSTEM”
  1. 0/3 Add support for GIT_ONE_FILESYSTEMLars R. Damerow, Mar 17, 2010
  2. 1/3 config.c: remove static keyword from git_env_bool()Lars R. Damerow, Mar 17, 2010
  3. 2/3 truncate cwd string before printing error messageLars R. Damerow, Mar 17, 2010
  4. 3/3 Add support for GIT_ONE_FILESYSTEMLars R. Damerow, Mar 17, 2010
  5. Jeff KingMar 28, 2010
  6. Jeff KingMar 28, 2010
  7. Junio C HamanoMar 28, 2010
  8. Lars DamerowMar 28, 2010
  9. Jeff KingMar 30, 2010
  10. Linus TorvaldsMar 30, 2010
  11. Thomas RastMar 30, 2010
  12. Jeff KingMar 30, 2010
  13. Jeff KingMar 30, 2010
  14. Junio C HamanoMar 30, 2010
  15. Linus TorvaldsMar 30, 2010
  16. Erik Faye-LundMar 31, 2010
  17. GIT_ONE_FILESYSTEM: flip the default to stop at filesystem boundariesJunio C Hamano, Apr 4, 2010
  18. Rename ONE_FILESYSTEM to DISCOVERY_ACROSS_FILESYSTEMJunio C Hamano, Apr 4, 2010
  19. Matthieu MoyApr 4, 2010
  20. Junio C HamanoApr 4, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.