Merge branch 'jk/repack-pack-keep-objects'
* jk/repack-pack-keep-objects: repack: add `repack.packKeptObjects` config var
This commit is contained in:
commit
249d54b231
@ -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
|
||||||
|
@ -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
|
||||||
-------------
|
-------------
|
||||||
|
@ -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,6 +200,7 @@ 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");
|
||||||
|
if (!pack_kept_objects)
|
||||||
argv_array_push(&cmd_args, "--honor-pack-keep");
|
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");
|
||||||
|
@ -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 &&
|
||||||
|
Loading…
Reference in New Issue
Block a user