From 230f13225df8b7e7eb0acc91a8c630f9e84967c1 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sat, 8 Oct 2005 15:54:01 -0700 Subject: Create object subdirectories on demand This makes it possible to have a "sparse" git object subdirectory structure, something that has become much more attractive now that people use pack-files all the time. As a result of pack-files, a git object directory doesn't necessarily have any individual objects lying around, and in that case it's just wasting space to keep the empty first-level object directories around: on many filesystems the 256 empty directories will be aboue 1MB of diskspace. Even more importantly, after you re-pack a project that _used_ to be unpacked, you could be left with huge directories that no longer contain anything, but that waste space and take time to look through. With this change, "git prune-packed" can just do an rmdir() on the directories, and they'll get removed if empty, and re-created on demand. This patch also tries to fix up "write_sha1_from_fd()" to use the new common infrastructure for creating the object files, closing a hole where we might otherwise leave half-written objects in the object database. [jc: I unoptimized the part that really removes the fan-out directories to ease transition. init-db still wastes 1MB of diskspace to hold 256 empty fan-outs, and prune-packed rmdir()'s the grown but empty directories, but runs mkdir() immediately after that -- reducing the saving from 150KB to 146KB. These parts will be re-introduced when everybody has the on-demand capability.] Signed-off-by: Linus Torvalds Signed-off-by: Junio C Hamano --- t/t0000-basic.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 't/t0000-basic.sh') diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh index bd940bd09b..5c5f854858 100755 --- a/t/t0000-basic.sh +++ b/t/t0000-basic.sh @@ -28,7 +28,7 @@ test_expect_success \ '.git/objects should be empty after git-init-db in an empty repo.' \ 'cmp -s /dev/null should-be-empty' -# also it should have 258 subdirectories; 256 fan-out, pack, and info. +# also it should have 258 subdirectories; 256 fan-out anymore, pack, and info. # 259 is counting "objects" itself find .git/objects -type d -print >full-of-directories test_expect_success \ -- cgit v1.2.3 From 9106c097ad87577019544f45fda11c4d73986597 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sun, 9 Oct 2005 02:30:17 -0700 Subject: Create object subdirectories on demand (phase II) This removes the unoptimization. The previous round does not mind missing fan-out directories, but still makes sure they exist, lest older versions choke on a repository created/packed by it. This round does not play that nicely anymore -- empty fan-out directories are not created by init-db, and will stay removed by prune-packed. The prune command also removes empty fan-out directories. Signed-off-by: Junio C Hamano --- git-prune.sh | 1 + init-db.c | 4 ---- prune-packed.c | 3 +-- t/t0000-basic.sh | 8 ++++---- 4 files changed, 6 insertions(+), 10 deletions(-) (limited to 't/t0000-basic.sh') diff --git a/git-prune.sh b/git-prune.sh index 9657dbf271..b28630cacf 100755 --- a/git-prune.sh +++ b/git-prune.sh @@ -22,6 +22,7 @@ sed -ne '/unreachable /{ }' | { cd "$GIT_OBJECT_DIRECTORY" || exit xargs $echo rm -f + rmdir 2>/dev/null [0-9a-f][0-9a-f] } git-prune-packed $dryrun diff --git a/init-db.c b/init-db.c index 2a4aa3c196..ca6fa4d420 100644 --- a/init-db.c +++ b/init-db.c @@ -281,10 +281,6 @@ int main(int argc, char **argv) memcpy(path, sha1_dir, len); safe_create_dir(sha1_dir); - for (i = 0; i < 256; i++) { - sprintf(path+len, "/%02x", i); - safe_create_dir(path); - } strcpy(path+len, "/pack"); safe_create_dir(path); strcpy(path+len, "/info"); diff --git a/prune-packed.c b/prune-packed.c index 1e0fc0cd9e..16685d1d8b 100644 --- a/prune-packed.c +++ b/prune-packed.c @@ -27,8 +27,7 @@ static void prune_dir(int i, DIR *dir, char *pathname, int len) error("unable to unlink %s", pathname); } pathname[len] = 0; - if (!rmdir(pathname)) - mkdir(pathname, 0777); + rmdir(pathname); } static void prune_packed_objects(void) diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh index 5c5f854858..dff7d69163 100755 --- a/t/t0000-basic.sh +++ b/t/t0000-basic.sh @@ -28,12 +28,12 @@ test_expect_success \ '.git/objects should be empty after git-init-db in an empty repo.' \ 'cmp -s /dev/null should-be-empty' -# also it should have 258 subdirectories; 256 fan-out anymore, pack, and info. -# 259 is counting "objects" itself +# also it should have 2 subdirectories; no fan-out anymore, pack, and info. +# 3 is counting "objects" itself find .git/objects -type d -print >full-of-directories test_expect_success \ - '.git/objects should have 258 subdirectories.' \ - 'test $(wc -l < full-of-directories) = 259' + '.git/objects should have 3 subdirectories.' \ + 'test $(wc -l < full-of-directories) = 3' ################################################################ # Basics of the basics -- cgit v1.2.3