From: Patrick Steinhardt <ps@pks.im>
To: git@vger.kernel.org
Cc: "Karthik Nayak" <karthik.188@gmail.com>,
"Justin Tobler" <jltobler@gmail.com>,
"Junio C Hamano" <gitster@pobox.com>,
"SZEDER Gábor" <szeder.dev@gmail.com>,
"Toon Claes" <toon@iotcl.com>, "Jeff King" <peff@peff.net>,
"Kristoffer Haugsbakk" <kristofferhaugsbakk@fastmail.com>,
"Ben Knoble" <ben.knoble@gmail.com>
Subject: [PATCH v3 0/9] refs: fix migration of reflog entries
Date: Tue, 29 Jul 2025 10:55:18 +0200 [thread overview]
Message-ID: <20250729-pks-reflog-append-v3-0-9614d310f073@pks.im> (raw)
In-Reply-To: <20250722-pks-reflog-append-v1-0-183e5949de16@pks.im>
Hi,
after the announcement that "reftable" will become the default backend
in Git 3.0 I've revived the efforts to implement this backend in
libgit2. I'm happy to report that this implementation is almost done by
now: out of 3000 tests only four are failing now.
For two of these tests I have been completely puzzled why those are
failing, as everything really looked perfectly fine in libgit2. As it
turned out, the bug wasn't in libgit2 though, but in Git. Namely, the
way we migrate reflog entries between storage formats is broken in two
ways:
- The identity we write into the reflog entries is wrong.
- The old commit ID of reflog entries is always set to all-zeroes.
This is what caused the libgit2 tests to fail, as I used `git refs
migrate` to convert test repositories to use reftables.
This patch series fixes both of these issues. Furthermore, it also adds
a new `git reflog write` subcommand to write new reflog entries for a
specific reference. This command was helpful to reproduce some test
constellations in libgit2.
Changes in v2:
- !!! The base of this topic has changed so that it sits on top of
v2.50.1. This is done so that we can backport this change to older
release tracks.
- A couple of typo fixes and clarifications for commit messages.
- Reorder sections in git-reflog(1) manpage according to the
reordering we have in the synopsis.
- Add a section for the new `write` command.
- Improve test coverage for the `git reflog write` command.
- Avoid `cat`ing a file into a Bash loop.
- Remove a stale comment.
- Make `ref_update_expects_existing_old_ref()` a bit more straight
forward.
- Link to v1: https://lore.kernel.org/r/20250722-pks-reflog-append-v1-0-183e5949de16@pks.im
Changes in v3:
- `git reflog write` now requires fully-qualified refnames.
- A new commit that plugs one part of the race around splitting of
reflogs for HEAD in the "files" backend.
- Link to v2: https://lore.kernel.org/r/20250725-pks-reflog-append-v2-0-e4e7cbe3f578@pks.im
Thanks!
Patrick
---
Patrick Steinhardt (9):
Documentation/git-reflog: convert to use synopsis type
builtin/reflog: improve grouping of subcommands
refs: export `ref_transaction_update_reflog()`
builtin/reflog: implement subcommand to write new entries
ident: fix type of string length parameter
refs: fix identity for migrated reflogs
refs/files: detect race when generating reflog entry for HEAD
refs: stop unsetting REF_HAVE_OLD for log-only updates
refs: fix invalid old object IDs when migrating reflogs
Documentation/git-reflog.adoc | 76 ++++++++++++++------------
builtin/reflog.c | 103 ++++++++++++++++++++++++++++-------
ident.c | 2 +-
ident.h | 2 +-
refs.c | 60 +++++++++++---------
refs.h | 24 +++++++-
refs/files-backend.c | 65 +++++++++++++++++++---
refs/refs-internal.h | 3 +-
refs/reftable-backend.c | 26 ++++++---
t/meson.build | 1 +
t/t1421-reflog-write.sh | 124 ++++++++++++++++++++++++++++++++++++++++++
t/t1460-refs-migrate.sh | 22 +++++---
12 files changed, 401 insertions(+), 107 deletions(-)
Range-diff versus v2:
1: 65f4647df02 = 1: 027ac6d12f3 Documentation/git-reflog: convert to use synopsis type
2: e53a402a88d = 2: 1570cac0cb9 builtin/reflog: improve grouping of subcommands
3: 4d060861f50 = 3: af43c907fa0 refs: export `ref_transaction_update_reflog()`
4: ddd471f9891 ! 4: 4322f98fcdd builtin/reflog: implement subcommand to write new entries
@@ Documentation/git-reflog.adoc: The "exists" subcommand checks whether a ref has
+The "write" subcommand writes a single entry to the reflog of a given
+reference. This new entry is appended to the reflog and will thus become
-+the most recent entry. Both the old and new object IDs must not be
-+abbreviated and must point to existing objects. The reflog message gets
-+normalized.
++the most recent entry. The reference name must be fully qualified. Both the old
++and new object IDs must not be abbreviated and must point to existing objects.
++The reflog message gets normalized.
+
The "delete" subcommand deletes single entries from the reflog, but
not the reflog itself. Its argument must be an _exact_ entry (e.g. "`git
@@ builtin/reflog.c: static int cmd_reflog_drop(int argc, const char **argv, const
+ usage_with_options(reflog_write_usage, options);
+
+ ref = argv[0];
-+ if (check_refname_format(ref, REFNAME_ALLOW_ONELEVEL))
++ if (!is_root_ref(ref) && check_refname_format(ref, 0))
+ die(_("invalid reference name: %s"), ref);
+
+ ret = get_oid_hex_algop(argv[1], &old_oid, repo->hash_algo);
@@ t/t1421-reflog-write.sh (new)
+ )
+'
+
++test_expect_success 'unqualified refname is rejected' '
++ test_when_finished "rm -rf repo" &&
++ git init repo &&
++ (
++ cd repo &&
++ test_must_fail git reflog write unqualified $ZERO_OID $ZERO_OID first 2>err &&
++ test_grep "invalid reference name: " err
++ )
++'
++
+test_expect_success 'nonexistent object IDs' '
+ test_when_finished "rm -rf repo" &&
+ git init repo &&
@@ t/t1421-reflog-write.sh (new)
+ )
+'
+
++test_expect_success 'can write to root ref' '
++ test_when_finished "rm -rf repo" &&
++ git init repo &&
++ (
++ cd repo &&
++ test_commit initial &&
++ COMMIT_OID=$(git rev-parse HEAD) &&
++
++ git reflog write ROOT_REF_HEAD $ZERO_OID $COMMIT_OID first &&
++ test_reflog_matches . ROOT_REF_HEAD <<-EOF
++ $ZERO_OID $COMMIT_OID $SIGNATURE first
++ EOF
++ )
++'
++
+test_done
5: 67028ef4439 = 5: 66de5312e83 ident: fix type of string length parameter
6: a6bf88a4e89 = 6: 2b9fe08cf76 refs: fix identity for migrated reflogs
-: ----------- > 7: 7f87327e17c refs/files: detect race when generating reflog entry for HEAD
7: 71b0f753dd3 = 8: 792a1d7ce61 refs: stop unsetting REF_HAVE_OLD for log-only updates
8: 2d88a1e57b8 = 9: 121630b9d64 refs: fix invalid old object IDs when migrating reflogs
---
base-commit: d82adb61ba2fd11d8f2587fca1b6bd7925ce4044
change-id: 20250722-pks-reflog-append-634172d8ab2c
next prev parent reply other threads:[~2025-07-29 8:55 UTC|newest]
Thread overview: 114+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-22 11:20 [PATCH 0/8] refs: fix migration of reflog entries Patrick Steinhardt
2025-07-22 11:20 ` [PATCH 1/8] Documentation/git-reflog: convert to use synopsis type Patrick Steinhardt
2025-07-22 22:04 ` Junio C Hamano
2025-07-22 11:20 ` [PATCH 2/8] builtin/reflog: improve grouping of subcommands Patrick Steinhardt
2025-07-23 18:14 ` Justin Tobler
2025-07-24 7:42 ` Patrick Steinhardt
2025-07-24 16:45 ` Junio C Hamano
2025-07-22 11:20 ` [PATCH 3/8] refs: export `ref_transaction_update_reflog()` Patrick Steinhardt
2025-07-23 18:25 ` Justin Tobler
2025-07-24 8:36 ` Karthik Nayak
2025-07-24 12:55 ` Toon Claes
2025-07-22 11:20 ` [PATCH 4/8] builtin/reflog: implement subcommand to write new entries Patrick Steinhardt
2025-07-23 19:00 ` Justin Tobler
2025-07-24 7:42 ` Patrick Steinhardt
2025-07-24 12:54 ` Toon Claes
2025-07-25 5:36 ` Patrick Steinhardt
2025-07-24 16:20 ` SZEDER Gábor
2025-07-24 21:10 ` Junio C Hamano
2025-07-25 5:36 ` Patrick Steinhardt
2025-07-25 14:35 ` Junio C Hamano
2025-07-22 11:20 ` [PATCH 5/8] ident: fix type of string length parameter Patrick Steinhardt
2025-07-22 11:20 ` [PATCH 6/8] refs: fix identity for migrated reflogs Patrick Steinhardt
2025-07-23 19:41 ` Justin Tobler
2025-07-24 7:42 ` Patrick Steinhardt
2025-07-24 9:41 ` Karthik Nayak
2025-07-24 12:56 ` Toon Claes
2025-07-22 11:20 ` [PATCH 7/8] refs: stop unsetting REF_HAVE_OLD for log-only updates Patrick Steinhardt
2025-07-23 20:31 ` Justin Tobler
2025-07-24 7:42 ` Patrick Steinhardt
2025-07-24 10:21 ` Karthik Nayak
2025-07-24 11:35 ` Patrick Steinhardt
2025-07-22 11:20 ` [PATCH 8/8] refs: fix invalid old object IDs when migrating reflogs Patrick Steinhardt
2025-07-22 22:09 ` Junio C Hamano
2025-07-23 4:04 ` Patrick Steinhardt
2025-07-25 6:58 ` [PATCH v2 0/8] refs: fix migration of reflog entries Patrick Steinhardt
2025-07-25 6:58 ` [PATCH v2 1/8] Documentation/git-reflog: convert to use synopsis type Patrick Steinhardt
2025-07-25 6:58 ` [PATCH v2 2/8] builtin/reflog: improve grouping of subcommands Patrick Steinhardt
2025-07-25 6:58 ` [PATCH v2 3/8] refs: export `ref_transaction_update_reflog()` Patrick Steinhardt
2025-07-25 6:58 ` [PATCH v2 4/8] builtin/reflog: implement subcommand to write new entries Patrick Steinhardt
2025-07-28 15:33 ` Kristoffer Haugsbakk
2025-07-28 18:49 ` Junio C Hamano
2025-07-28 20:39 ` Karthik Nayak
2025-07-28 20:59 ` Junio C Hamano
2025-07-30 7:55 ` Karthik Nayak
2025-07-29 0:25 ` Ben Knoble
2025-07-29 6:14 ` Kristoffer Haugsbakk
2025-07-29 6:51 ` Patrick Steinhardt
2025-07-29 15:00 ` Junio C Hamano
2025-07-30 5:33 ` Patrick Steinhardt
2025-07-30 10:33 ` Patrick Steinhardt
2025-07-25 6:58 ` [PATCH v2 5/8] ident: fix type of string length parameter Patrick Steinhardt
2025-07-25 6:58 ` [PATCH v2 6/8] refs: fix identity for migrated reflogs Patrick Steinhardt
2025-07-25 6:58 ` [PATCH v2 7/8] refs: stop unsetting REF_HAVE_OLD for log-only updates Patrick Steinhardt
2025-07-25 11:36 ` Jeff King
2025-07-28 14:43 ` Patrick Steinhardt
2025-07-29 7:14 ` Jeff King
2025-07-29 7:54 ` Patrick Steinhardt
2025-07-25 6:58 ` [PATCH v2 8/8] refs: fix invalid old object IDs when migrating reflogs Patrick Steinhardt
2025-07-29 8:55 ` Patrick Steinhardt [this message]
2025-07-29 8:55 ` [PATCH v3 1/9] Documentation/git-reflog: convert to use synopsis type Patrick Steinhardt
2025-07-29 8:55 ` [PATCH v3 2/9] builtin/reflog: improve grouping of subcommands Patrick Steinhardt
2025-07-29 8:55 ` [PATCH v3 3/9] refs: export `ref_transaction_update_reflog()` Patrick Steinhardt
2025-08-01 11:38 ` Toon Claes
2025-08-04 7:37 ` Patrick Steinhardt
2025-07-29 8:55 ` [PATCH v3 4/9] builtin/reflog: implement subcommand to write new entries Patrick Steinhardt
2025-07-29 16:07 ` Junio C Hamano
2025-08-01 11:37 ` Toon Claes
2025-08-04 7:38 ` Patrick Steinhardt
2025-07-29 8:55 ` [PATCH v3 5/9] ident: fix type of string length parameter Patrick Steinhardt
2025-07-29 8:55 ` [PATCH v3 6/9] refs: fix identity for migrated reflogs Patrick Steinhardt
2025-07-29 8:55 ` [PATCH v3 7/9] refs/files: detect race when generating reflog entry for HEAD Patrick Steinhardt
2025-07-29 16:16 ` Junio C Hamano
2025-08-01 11:55 ` Toon Claes
2025-08-02 11:11 ` Jeff King
2025-08-04 7:38 ` Patrick Steinhardt
2025-08-04 14:47 ` Jeff King
2025-07-29 8:55 ` [PATCH v3 8/9] refs: stop unsetting REF_HAVE_OLD for log-only updates Patrick Steinhardt
2025-07-29 8:55 ` [PATCH v3 9/9] refs: fix invalid old object IDs when migrating reflogs Patrick Steinhardt
2025-08-04 9:46 ` [PATCH v4 0/9] refs: fix migration of reflog entries Patrick Steinhardt
2025-08-04 9:46 ` [PATCH v4 1/9] Documentation/git-reflog: convert to use synopsis type Patrick Steinhardt
2025-08-04 9:46 ` [PATCH v4 2/9] builtin/reflog: improve grouping of subcommands Patrick Steinhardt
2025-08-04 9:46 ` [PATCH v4 3/9] refs: export `ref_transaction_update_reflog()` Patrick Steinhardt
2025-08-04 9:46 ` [PATCH v4 4/9] builtin/reflog: implement subcommand to write new entries Patrick Steinhardt
2025-08-04 9:46 ` [PATCH v4 5/9] ident: fix type of string length parameter Patrick Steinhardt
2025-08-04 9:46 ` [PATCH v4 6/9] refs: fix identity for migrated reflogs Patrick Steinhardt
2025-08-04 9:46 ` [PATCH v4 7/9] refs/files: detect race when generating reflog entry for HEAD Patrick Steinhardt
2025-08-04 15:38 ` Jeff King
2025-08-04 9:46 ` [PATCH v4 8/9] refs: stop unsetting REF_HAVE_OLD for log-only updates Patrick Steinhardt
2025-08-04 9:46 ` [PATCH v4 9/9] refs: fix invalid old object IDs when migrating reflogs Patrick Steinhardt
2025-08-05 15:11 ` [PATCH v5 0/9] refs: fix migration of reflog entries Patrick Steinhardt
2025-08-05 15:11 ` [PATCH v5 1/9] Documentation/git-reflog: convert to use synopsis type Patrick Steinhardt
2025-08-05 17:04 ` Jean-Noël AVILA
2025-08-05 21:47 ` Junio C Hamano
2025-08-06 5:53 ` Patrick Steinhardt
2025-08-05 15:11 ` [PATCH v5 2/9] builtin/reflog: improve grouping of subcommands Patrick Steinhardt
2025-08-05 15:11 ` [PATCH v5 3/9] refs: export `ref_transaction_update_reflog()` Patrick Steinhardt
2025-08-05 15:11 ` [PATCH v5 4/9] builtin/reflog: implement subcommand to write new entries Patrick Steinhardt
2025-08-05 15:11 ` [PATCH v5 5/9] ident: fix type of string length parameter Patrick Steinhardt
2025-08-05 15:11 ` [PATCH v5 6/9] refs: fix identity for migrated reflogs Patrick Steinhardt
2025-08-05 15:11 ` [PATCH v5 7/9] refs/files: detect race when generating reflog entry for HEAD Patrick Steinhardt
2025-08-05 15:11 ` [PATCH v5 8/9] refs: stop unsetting REF_HAVE_OLD for log-only updates Patrick Steinhardt
2025-08-05 15:11 ` [PATCH v5 9/9] refs: fix invalid old object IDs when migrating reflogs Patrick Steinhardt
2025-08-05 18:47 ` [PATCH v5 0/9] refs: fix migration of reflog entries Jeff King
2025-08-06 5:53 ` Patrick Steinhardt
2025-08-06 5:54 ` [PATCH v6 " Patrick Steinhardt
2025-08-06 5:54 ` [PATCH v6 1/9] Documentation/git-reflog: convert to use synopsis type Patrick Steinhardt
2025-08-06 5:54 ` [PATCH v6 2/9] builtin/reflog: improve grouping of subcommands Patrick Steinhardt
2025-08-06 5:54 ` [PATCH v6 3/9] refs: export `ref_transaction_update_reflog()` Patrick Steinhardt
2025-08-06 5:54 ` [PATCH v6 4/9] builtin/reflog: implement subcommand to write new entries Patrick Steinhardt
2025-08-06 5:54 ` [PATCH v6 5/9] ident: fix type of string length parameter Patrick Steinhardt
2025-08-06 5:54 ` [PATCH v6 6/9] refs: fix identity for migrated reflogs Patrick Steinhardt
2025-08-06 5:54 ` [PATCH v6 7/9] refs/files: detect race when generating reflog entry for HEAD Patrick Steinhardt
2025-08-06 5:54 ` [PATCH v6 8/9] refs: stop unsetting REF_HAVE_OLD for log-only updates Patrick Steinhardt
2025-08-06 5:54 ` [PATCH v6 9/9] refs: fix invalid old object IDs when migrating reflogs Patrick Steinhardt
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=20250729-pks-reflog-append-v3-0-9614d310f073@pks.im \
--to=ps@pks.im \
--cc=ben.knoble@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jltobler@gmail.com \
--cc=karthik.188@gmail.com \
--cc=kristofferhaugsbakk@fastmail.com \
--cc=peff@peff.net \
--cc=szeder.dev@gmail.com \
--cc=toon@iotcl.com \
/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).