Merge branch 'jk/repack-pack-keep-objects'

* jk/repack-pack-keep-objects:
  repack: add `repack.packKeptObjects` config var
This commit is contained in:
Junio C Hamano 2014-03-18 13:50:29 -07:00
commit 249d54b231
4 changed files with 44 additions and 2 deletions

View File

@ -2156,6 +2156,13 @@ repack.usedeltabaseoffset::
"false" and repack. Access from old Git versions over the "false" and repack. Access from old Git versions over the
native protocol are unaffected by this option. native protocol are unaffected by this option.
repack.packKeptObjects::
If set to true, makes `git repack` act as if
`--pack-kept-objects` was passed. See linkgit:git-repack[1] for
details. Defaults to `false` normally, but `true` if a bitmap
index is being written (either via `--write-bitmap-index` or
`pack.writeBitmaps`).
rerere.autoupdate:: rerere.autoupdate::
When set to true, `git-rerere` updates the index with the When set to true, `git-rerere` updates the index with the
resulting contents after it cleanly resolves conflicts using resulting contents after it cleanly resolves conflicts using

View File

@ -117,6 +117,14 @@ other objects in that pack they already have locally.
must be able to refer to all reachable objects. This option must be able to refer to all reachable objects. This option
overrides the setting of `pack.writebitmaps`. overrides the setting of `pack.writebitmaps`.
--pack-kept-objects::
Include objects in `.keep` files when repacking. Note that we
still do not delete `.keep` packs after `pack-objects` finishes.
This means that we may duplicate objects, but this makes the
option safe to use when there are concurrent pushes or fetches.
This option is generally only useful if you are writing bitmaps
with `-b` or `pack.writebitmaps`, as it ensures that the
bitmapped packfile has the necessary objects.
Configuration Configuration
------------- -------------

View File

@ -9,6 +9,7 @@
#include "argv-array.h" #include "argv-array.h"
static int delta_base_offset = 1; static int delta_base_offset = 1;
static int pack_kept_objects = -1;
static char *packdir, *packtmp; static char *packdir, *packtmp;
static const char *const git_repack_usage[] = { static const char *const git_repack_usage[] = {
@ -22,6 +23,10 @@ static int repack_config(const char *var, const char *value, void *cb)
delta_base_offset = git_config_bool(var, value); delta_base_offset = git_config_bool(var, value);
return 0; return 0;
} }
if (!strcmp(var, "repack.packkeptobjects")) {
pack_kept_objects = git_config_bool(var, value);
return 0;
}
return git_default_config(var, value, cb); return git_default_config(var, value, cb);
} }
@ -175,6 +180,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
N_("limits the maximum delta depth")), N_("limits the maximum delta depth")),
OPT_STRING(0, "max-pack-size", &max_pack_size, N_("bytes"), OPT_STRING(0, "max-pack-size", &max_pack_size, N_("bytes"),
N_("maximum size of each packfile")), N_("maximum size of each packfile")),
OPT_BOOL(0, "pack-kept-objects", &pack_kept_objects,
N_("repack objects in packs marked with .keep")),
OPT_END() OPT_END()
}; };
@ -183,6 +190,9 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, builtin_repack_options, argc = parse_options(argc, argv, prefix, builtin_repack_options,
git_repack_usage, 0); git_repack_usage, 0);
if (pack_kept_objects < 0)
pack_kept_objects = write_bitmap;
packdir = mkpathdup("%s/pack", get_object_directory()); packdir = mkpathdup("%s/pack", get_object_directory());
packtmp = mkpathdup("%s/.tmp-%d-pack", packdir, (int)getpid()); packtmp = mkpathdup("%s/.tmp-%d-pack", packdir, (int)getpid());
@ -190,7 +200,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
argv_array_push(&cmd_args, "pack-objects"); argv_array_push(&cmd_args, "pack-objects");
argv_array_push(&cmd_args, "--keep-true-parents"); argv_array_push(&cmd_args, "--keep-true-parents");
argv_array_push(&cmd_args, "--honor-pack-keep"); if (!pack_kept_objects)
argv_array_push(&cmd_args, "--honor-pack-keep");
argv_array_push(&cmd_args, "--non-empty"); argv_array_push(&cmd_args, "--non-empty");
argv_array_push(&cmd_args, "--all"); argv_array_push(&cmd_args, "--all");
argv_array_push(&cmd_args, "--reflog"); argv_array_push(&cmd_args, "--reflog");

View File

@ -21,7 +21,7 @@ test_expect_success 'objects in packs marked .keep are not repacked' '
objsha1=$(git verify-pack -v pack-$packsha1.idx | head -n 1 | objsha1=$(git verify-pack -v pack-$packsha1.idx | head -n 1 |
sed -e "s/^\([0-9a-f]\{40\}\).*/\1/") && sed -e "s/^\([0-9a-f]\{40\}\).*/\1/") &&
mv pack-* .git/objects/pack/ && mv pack-* .git/objects/pack/ &&
git repack -A -d -l && git repack --no-pack-kept-objects -A -d -l &&
git prune-packed && git prune-packed &&
for p in .git/objects/pack/*.idx; do for p in .git/objects/pack/*.idx; do
idx=$(basename $p) idx=$(basename $p)
@ -35,6 +35,22 @@ test_expect_success 'objects in packs marked .keep are not repacked' '
test -z "$found_duplicate_object" test -z "$found_duplicate_object"
' '
test_expect_success 'writing bitmaps can duplicate .keep objects' '
# build on $objsha1, $packsha1, and .keep state from previous
git repack -Adl &&
test_when_finished "found_duplicate_object=" &&
for p in .git/objects/pack/*.idx; do
idx=$(basename $p)
test "pack-$packsha1.idx" = "$idx" && continue
if git verify-pack -v $p | egrep "^$objsha1"; then
found_duplicate_object=1
echo "DUPLICATE OBJECT FOUND"
break
fi
done &&
test "$found_duplicate_object" = 1
'
test_expect_success 'loose objects in alternate ODB are not repacked' ' test_expect_success 'loose objects in alternate ODB are not repacked' '
mkdir alt_objects && mkdir alt_objects &&
echo `pwd`/alt_objects > .git/objects/info/alternates && echo `pwd`/alt_objects > .git/objects/info/alternates &&