From: Karthik Nayak <karthik.188@gmail.com>
To: git@vger.kernel.org
Cc: Karthik Nayak <karthik.188@gmail.com>
Subject: [PATCH] builtin/refs: add '--skip-reflog' flag to bypass reflog migration
Date: Fri, 07 Feb 2025 12:57:31 +0100 [thread overview]
Message-ID: <20250207-477-refs-migrate-add-a-flag-to-ignore-reflogs-during-migration-v1-1-7d40f3b4e30b@gmail.com> (raw)
The 'git-refs(1)' migrate subcommand, which transfers repositories
between reference backends, currently migrates reflogs by default as of
In 246cebe320 (refs: add support for migrating reflogs, 2024-12-16).
While this behavior is desirable for most client-side repositories,
server-side repositories typically don't use reflogs and the migration
of these entries is unnecessary overhead.
Add a '--skip-reflog' flag to the migrate subcommand to make reflog
migration optional. This is particularly useful for server-side
migrations where reflogs are not needed, improving migration performance
in these scenarios.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
---
builtin/refs.c | 3 +++
refs.c | 8 +++++---
refs.h | 5 ++++-
t/t1460-refs-migrate.sh | 17 +++++++++++++++--
4 files changed, 27 insertions(+), 6 deletions(-)
diff --git a/builtin/refs.c b/builtin/refs.c
index a29f19583474518ee0942ea53c39cbdf9661c5e2..30be0254c14dd3d07693d70c25dddc9990756e9c 100644
--- a/builtin/refs.c
+++ b/builtin/refs.c
@@ -30,6 +30,9 @@ static int cmd_refs_migrate(int argc, const char **argv, const char *prefix,
OPT_BIT(0, "dry-run", &flags,
N_("perform a non-destructive dry-run"),
REPO_MIGRATE_REF_STORAGE_FORMAT_DRYRUN),
+ OPT_BIT(0, "skip-reflog", &flags,
+ N_("skip migrating reflogs"),
+ REPO_MIGRATE_REF_STORAGE_FORMAT_SKIP_REFLOG),
OPT_END(),
};
struct strbuf errbuf = STRBUF_INIT;
diff --git a/refs.c b/refs.c
index f4094a326a9f88f979654b668cc9c3d27d83cb5d..5e8f5c06fa68d16c93ee11edd9742995eea994b6 100644
--- a/refs.c
+++ b/refs.c
@@ -3035,9 +3035,11 @@ int repo_migrate_ref_storage_format(struct repository *repo,
if (ret < 0)
goto done;
- ret = refs_for_each_reflog(old_refs, migrate_one_reflog, &data);
- if (ret < 0)
- goto done;
+ if (!(flags & REPO_MIGRATE_REF_STORAGE_FORMAT_SKIP_REFLOG)) {
+ ret = refs_for_each_reflog(old_refs, migrate_one_reflog, &data);
+ if (ret < 0)
+ goto done;
+ }
ret = ref_transaction_commit(transaction, errbuf);
if (ret < 0)
diff --git a/refs.h b/refs.h
index a0cdd99250e8286b55808b697b0a94afac5d8319..ccee8fc6705e6e93a1c6234e7395180f8dfd815b 100644
--- a/refs.h
+++ b/refs.h
@@ -1157,8 +1157,11 @@ int is_pseudo_ref(const char *refname);
* - REPO_MIGRATE_REF_STORAGE_FORMAT_DRYRUN: perform a dry-run migration
* without touching the main repository. The result will be written into a
* temporary ref storage directory.
+ *
+ * - REPO_MIGRATE_REF_STORAGE_FORMAT_SKIP_REFLOG: skip migration of reflogs.
*/
-#define REPO_MIGRATE_REF_STORAGE_FORMAT_DRYRUN (1 << 0)
+#define REPO_MIGRATE_REF_STORAGE_FORMAT_DRYRUN (1 << 0)
+#define REPO_MIGRATE_REF_STORAGE_FORMAT_SKIP_REFLOG (1 << 1)
/*
* Migrate the ref storage format used by the repository to the
diff --git a/t/t1460-refs-migrate.sh b/t/t1460-refs-migrate.sh
index a6d9b35a46eb59350aa0d59d982a2fbfaecf1448..9059d4c4121842a9d2e77dc4e54c537eeff8afab 100755
--- a/t/t1460-refs-migrate.sh
+++ b/t/t1460-refs-migrate.sh
@@ -9,14 +9,16 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
# Migrate the provided repository from one format to the other and
# verify that the references and logs are migrated over correctly.
-# Usage: test_migration <repo> <format> <skip_reflog_verify>
+# Usage: test_migration <repo> <format> <skip_reflog_verify> <...options>
# <repo> is the relative path to the repo to be migrated.
# <format> is the ref format to be migrated to.
# <skip_reflog_verify> (true or false) whether to skip reflog verification.
+# <...options> are other options be passed directly to 'git refs migrate'.
test_migration () {
repo=$1 &&
format=$2 &&
skip_reflog_verify=${3:-false} &&
+ shift $(( $# >= 3 ? 3 : 2 )) &&
git -C "$repo" for-each-ref --include-root-refs \
--format='%(refname) %(objectname) %(symref)' >expect &&
if ! $skip_reflog_verify
@@ -25,7 +27,7 @@ test_migration () {
git -C "$repo" reflog list >expect_log_list
fi &&
- git -C "$repo" refs migrate --ref-format="$2" &&
+ git -C "$repo" refs migrate --ref-format="$format" $@ &&
git -C "$repo" for-each-ref --include-root-refs \
--format='%(refname) %(objectname) %(symref)' >actual &&
@@ -241,6 +243,17 @@ do
test_cmp expect.reflog actual.reflog
)
'
+
+ test_expect_success "$from_format -> $to_format: skip reflog with --skip-reflog" '
+ test_when_finished "rm -rf repo" &&
+ git init --ref-format=$from_format repo &&
+ test_commit -C repo initial &&
+ # we see that the repository contains reflogs.
+ test 2 = $(git -C repo reflog --all | wc -l) &&
+ test_migration repo "$to_format" true --skip-reflog &&
+ # there should be no reflogs post migration.
+ test 0 = $(git -C repo reflog --all | wc -l)
+ '
done
done
---
base-commit: bc204b742735ae06f65bb20291c95985c9633b7f
change-id: 20250207-477-refs-migrate-add-a-flag-to-ignore-reflogs-during-migration-8066f6df50ac
Thanks
- Karthik
next reply other threads:[~2025-02-07 11:57 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-07 11:57 Karthik Nayak [this message]
2025-02-07 15:23 ` [PATCH] builtin/refs: add '--skip-reflog' flag to bypass reflog migration Patrick Steinhardt
2025-02-11 6:18 ` Karthik Nayak
2025-02-07 17:45 ` Justin Tobler
2025-02-11 6:09 ` Karthik Nayak
2025-02-11 11:42 ` [PATCH v2] " Karthik Nayak
2025-02-11 12:21 ` Patrick Steinhardt
2025-02-11 17:48 ` Junio C Hamano
2025-02-12 17:43 ` Karthik Nayak
2025-02-13 9:25 ` Karthik Nayak
2025-02-12 18:38 ` [PATCH v3] " Karthik Nayak
2025-02-12 22:25 ` Junio C Hamano
2025-02-13 9:22 ` Karthik Nayak
2025-02-13 18:06 ` Junio C Hamano
2025-02-14 8:50 ` Karthik Nayak
2025-02-19 10:06 ` Toon Claes
2025-02-19 17:04 ` Junio C Hamano
2025-02-19 20:28 ` Karthik Nayak
2025-02-19 21:37 ` Junio C Hamano
2025-02-20 10:00 ` Karthik Nayak
2025-02-20 9:56 ` [PATCH v4] builtin/refs: add '--no-reflog' flag to drop reflogs Karthik Nayak
2025-02-20 15:14 ` Junio C Hamano
2025-02-21 8:44 ` Karthik Nayak
2025-02-21 10:04 ` [PATCH v5] " Karthik Nayak
2025-02-21 17:54 ` Junio C Hamano
2025-02-23 20:30 ` Karthik Nayak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250207-477-refs-migrate-add-a-flag-to-ignore-reflogs-during-migration-v1-1-7d40f3b4e30b@gmail.com \
--to=karthik.188@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).