In a large repository which uses directories to organize many refs, "git pack-refs --all --prune" does not improve performance so much as it should, unless we remove all the now-empty directories as well. Signed-off-by: Greg Price <price@xxxxxxxxxxx> --- pack-refs.c | 8 ++++++++ t/t3210-pack-refs.sh | 6 ++++++ 2 files changed, 14 insertions(+), 0 deletions(-) diff --git a/pack-refs.c b/pack-refs.c index 7f43f8a..33d7358 100644 --- a/pack-refs.c +++ b/pack-refs.c @@ -63,11 +63,19 @@ static int handle_one_ref(const char *path, const unsigned char *sha1, /* make sure nobody touched the ref, and unlink */ static void prune_ref(struct ref_to_prune *r) { + char *p, *q; struct ref_lock *lock = lock_ref_sha1(r->name + 5, r->sha1); if (lock) { unlink_or_warn(git_path("%s", r->name)); unlock_ref(lock); + + /* remove the directory if empty */ + for (q = p = r->name; *p; p++) + if (*p == '/') + q = p; + *q = '\0'; + rmdir(r->name); } } diff --git a/t/t3210-pack-refs.sh b/t/t3210-pack-refs.sh index 413019a..c60ede1 100755 --- a/t/t3210-pack-refs.sh +++ b/t/t3210-pack-refs.sh @@ -60,6 +60,12 @@ test_expect_success 'see if git pack-refs --prune remove ref files' ' ! test -f .git/refs/heads/f ' +test_expect_success 'see if git pack-refs --prune removes empty dirs' ' + git branch r/s && + git pack-refs --all --prune && + ! test -e .git/refs/heads/r +' + test_expect_success \ 'git branch g should work when git branch g/h has been deleted' \ 'git branch g/h && -- 1.6.6.32.g6380e -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html