pack-refs: teach --exclude option to exclude refs from being packed
At GitLab, we have a system that creates ephemeral internal refs that don't live long before getting deleted. Having an option to exclude certain refs from a packed-refs file allows these internal references to be deleted much more efficiently. Add an --exclude option to the pack-refs builtin, and use the ref exclusions API to exclude certain refs from being packed into the final packed-refs file Signed-off-by: John Cai <johncai86@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
@ -4,22 +4,34 @@
|
||||
#include "parse-options.h"
|
||||
#include "refs.h"
|
||||
#include "repository.h"
|
||||
#include "revision.h"
|
||||
|
||||
static char const * const pack_refs_usage[] = {
|
||||
N_("git pack-refs [--all] [--no-prune]"),
|
||||
N_("git pack-refs [--all] [--no-prune] [--exclude <pattern>]"),
|
||||
NULL
|
||||
};
|
||||
|
||||
int cmd_pack_refs(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
unsigned int flags = PACK_REFS_PRUNE;
|
||||
static struct ref_exclusions excludes = REF_EXCLUSIONS_INIT;
|
||||
struct pack_refs_opts pack_refs_opts = {.exclusions = &excludes, .flags = flags};
|
||||
static struct string_list option_excluded_refs = STRING_LIST_INIT_NODUP;
|
||||
struct string_list_item *item;
|
||||
|
||||
struct option opts[] = {
|
||||
OPT_BIT(0, "all", &flags, N_("pack everything"), PACK_REFS_ALL),
|
||||
OPT_BIT(0, "prune", &flags, N_("prune loose refs (default)"), PACK_REFS_PRUNE),
|
||||
OPT_BIT(0, "all", &pack_refs_opts.flags, N_("pack everything"), PACK_REFS_ALL),
|
||||
OPT_BIT(0, "prune", &pack_refs_opts.flags, N_("prune loose refs (default)"), PACK_REFS_PRUNE),
|
||||
OPT_STRING_LIST(0, "exclude", &option_excluded_refs, N_("pattern"),
|
||||
N_("references to exclude")),
|
||||
OPT_END(),
|
||||
};
|
||||
git_config(git_default_config, NULL);
|
||||
if (parse_options(argc, argv, prefix, opts, pack_refs_usage, 0))
|
||||
usage_with_options(pack_refs_usage, opts);
|
||||
return refs_pack_refs(get_main_ref_store(the_repository), flags);
|
||||
|
||||
for_each_string_list_item(item, &option_excluded_refs)
|
||||
add_ref_exclusion(pack_refs_opts.exclusions, item->string);
|
||||
|
||||
return refs_pack_refs(get_main_ref_store(the_repository), &pack_refs_opts);
|
||||
}
|
||||
|
Reference in New Issue
Block a user