[PATCH 0/7] refs: add reflog support to `git refs migrate`
From: Karthik Nayak <hidden>
Date: 2024-12-09 11:07:24
The `git refs migrate` command was introduced in
25a0023f28 (builtin/refs: new command to migrate ref storage formats,
2024-06-06) to support migrating from one reference backend to another.
One limitation of the feature was that it didn't support migrating
repositories which contained reflogs. This isn't a requirement on the
server side as repositories are stored as bare repositories (which do
not contain any reflogs). Clients however generally use reflogs and
until now couldn't use the `git refs migrate` command to migrate their
repositories to the new reftable format.
One of the issues for adding reflog support is that the ref transactions
don't support reflogs additions:
1. While there is REF_LOG_ONLY flag, there is no function to utilize
the flag and add reflogs.
2. reference backends generally sort the updates by the refname. This
wouldn't work for reflogs which need to ensure that they maintain the
order of creation.
3. In the files backend, reflog entries are added by obtaining locks
on the refs themselves. This means each update in the transaction, will
obtain a ref_lock. This paradigm fails to accompany the fact that there
could be multiple reflog updates for a refname in a single transaction.
4. The backends check for duplicate entries, which doesn't make sense
in the context of adding multiple reflogs for a given refname.
We overcome these issue we make the following changes:
- Update the ref_update structure to also include the committer
information. Using this, we can add a new function which only adds
reflog updates to the transaction.
- Add an index field to the ref_update structure, this will help order
updates in pre-defined order, this fixes #2.
- While the ideal fix for #3 would be to actually introduce reflog
locks, this wouldn't be possible without breaking backward
compatibility. So we add a count field to the existing ref_lock. With
this, multiple reflog updates can share a single ref_lock.
Overall, this series is a bit more involved, and I would appreciate it
if it receives a bit more scrutiny.
Signed-off-by: Karthik Nayak <redacted>
---
Karthik Nayak (7):
refs: include committer info in `ref_update` struct
refs: add `index` field to `struct ref_udpate`
refs/files: add count field to ref_lock
refs: extract out refname verification in transactions
refs: introduce the `ref_transaction_update_reflog` function
refs: allow multiple reflog entries for the same refname
refs: add support for migrating reflogs
Documentation/git-refs.txt | 2 -
refs.c | 204 ++++++++++++++++++++++++++++++++-------------
refs.h | 12 +++
refs/files-backend.c | 144 ++++++++++++++++++++------------
refs/refs-internal.h | 24 ++++--
refs/reftable-backend.c | 47 +++++++++--
t/t1460-refs-migrate.sh | 73 +++++++++++-----
7 files changed, 360 insertions(+), 146 deletions(-)
---
---
base-commit: e66fd72e972df760a53c3d6da023c17adfc426d6
change-id: 20241111-320-git-refs-migrate-reflogs-a53e3a6cffc9
Thanks
- Karthik