mirror of
https://github.com/git/git.git
synced 2026-01-09 17:46:37 +00:00
The "git refs migrate" subcommand converts the backend used for ref storage. It always migrates reflog data as well as refs. Introduce an option to exclude reflogs from migration, allowing them to be discarded when they are unnecessary. This is particularly useful in server-side repositories, where reflogs are typically not expected. However, some repositories may still have them due to historical reasons, such as bugs, misconfigurations, or administrative decisions to enable reflogs for debugging. In such repositories, it would be optimal to drop reflogs during the migration. To address this, introduce the '--no-reflog' flag, which prevents reflog migration. When this flag is used, reflogs from the original reference backend are migrated. Since only the new reference backend remains in the repository, all previous reflogs are permanently discarded. Helped-by: Junio C Hamano <gitster@pobox.com> Helped-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Karthik Nayak <karthik.188@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
124 lines
3.2 KiB
C
124 lines
3.2 KiB
C
#define USE_THE_REPOSITORY_VARIABLE
|
|
#include "builtin.h"
|
|
#include "config.h"
|
|
#include "fsck.h"
|
|
#include "parse-options.h"
|
|
#include "refs.h"
|
|
#include "strbuf.h"
|
|
#include "worktree.h"
|
|
|
|
#define REFS_MIGRATE_USAGE \
|
|
N_("git refs migrate --ref-format=<format> [--dry-run]")
|
|
|
|
#define REFS_VERIFY_USAGE \
|
|
N_("git refs verify [--strict] [--verbose]")
|
|
|
|
static int cmd_refs_migrate(int argc, const char **argv, const char *prefix,
|
|
struct repository *repo UNUSED)
|
|
{
|
|
const char * const migrate_usage[] = {
|
|
REFS_MIGRATE_USAGE,
|
|
NULL,
|
|
};
|
|
const char *format_str = NULL;
|
|
enum ref_storage_format format;
|
|
unsigned int flags = 0;
|
|
struct option options[] = {
|
|
OPT_STRING_F(0, "ref-format", &format_str, N_("format"),
|
|
N_("specify the reference format to convert to"),
|
|
PARSE_OPT_NONEG),
|
|
OPT_BIT(0, "dry-run", &flags,
|
|
N_("perform a non-destructive dry-run"),
|
|
REPO_MIGRATE_REF_STORAGE_FORMAT_DRYRUN),
|
|
OPT_BIT(0, "no-reflog", &flags,
|
|
N_("drop reflogs entirely during the migration"),
|
|
REPO_MIGRATE_REF_STORAGE_FORMAT_SKIP_REFLOG),
|
|
OPT_END(),
|
|
};
|
|
struct strbuf errbuf = STRBUF_INIT;
|
|
int err;
|
|
|
|
argc = parse_options(argc, argv, prefix, options, migrate_usage, 0);
|
|
if (argc)
|
|
usage(_("too many arguments"));
|
|
if (!format_str)
|
|
usage(_("missing --ref-format=<format>"));
|
|
|
|
format = ref_storage_format_by_name(format_str);
|
|
if (format == REF_STORAGE_FORMAT_UNKNOWN) {
|
|
err = error(_("unknown ref storage format '%s'"), format_str);
|
|
goto out;
|
|
}
|
|
|
|
if (the_repository->ref_storage_format == format) {
|
|
err = error(_("repository already uses '%s' format"),
|
|
ref_storage_format_to_name(format));
|
|
goto out;
|
|
}
|
|
|
|
if (repo_migrate_ref_storage_format(the_repository, format, flags, &errbuf) < 0) {
|
|
err = error("%s", errbuf.buf);
|
|
goto out;
|
|
}
|
|
|
|
err = 0;
|
|
|
|
out:
|
|
strbuf_release(&errbuf);
|
|
return err;
|
|
}
|
|
|
|
static int cmd_refs_verify(int argc, const char **argv, const char *prefix,
|
|
struct repository *repo UNUSED)
|
|
{
|
|
struct fsck_options fsck_refs_options = FSCK_REFS_OPTIONS_DEFAULT;
|
|
struct worktree **worktrees;
|
|
const char * const verify_usage[] = {
|
|
REFS_VERIFY_USAGE,
|
|
NULL,
|
|
};
|
|
struct option options[] = {
|
|
OPT_BOOL(0, "verbose", &fsck_refs_options.verbose, N_("be verbose")),
|
|
OPT_BOOL(0, "strict", &fsck_refs_options.strict, N_("enable strict checking")),
|
|
OPT_END(),
|
|
};
|
|
int ret = 0;
|
|
|
|
argc = parse_options(argc, argv, prefix, options, verify_usage, 0);
|
|
if (argc)
|
|
usage(_("'git refs verify' takes no arguments"));
|
|
|
|
git_config(git_fsck_config, &fsck_refs_options);
|
|
prepare_repo_settings(the_repository);
|
|
|
|
worktrees = get_worktrees();
|
|
for (size_t i = 0; worktrees[i]; i++)
|
|
ret |= refs_fsck(get_worktree_ref_store(worktrees[i]),
|
|
&fsck_refs_options, worktrees[i]);
|
|
|
|
fsck_options_clear(&fsck_refs_options);
|
|
free_worktrees(worktrees);
|
|
return ret;
|
|
}
|
|
|
|
int cmd_refs(int argc,
|
|
const char **argv,
|
|
const char *prefix,
|
|
struct repository *repo)
|
|
{
|
|
const char * const refs_usage[] = {
|
|
REFS_MIGRATE_USAGE,
|
|
REFS_VERIFY_USAGE,
|
|
NULL,
|
|
};
|
|
parse_opt_subcommand_fn *fn = NULL;
|
|
struct option opts[] = {
|
|
OPT_SUBCOMMAND("migrate", &fn, cmd_refs_migrate),
|
|
OPT_SUBCOMMAND("verify", &fn, cmd_refs_verify),
|
|
OPT_END(),
|
|
};
|
|
|
|
argc = parse_options(argc, argv, prefix, opts, refs_usage, 0);
|
|
return fn(argc, argv, prefix, repo);
|
|
}
|