All of lore.kernel.org
 help / color / mirror / Atom feed
From: Aleksei Sviridkin <f@lex.la>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>, Aleksei Sviridkin <f@lex.la>
Subject: [PATCH v2] push: fix --force-if-includes when remote-tracking ref has no reflog
Date: Fri,  4 Sep 2026 15:44:33 +0300	[thread overview]
Message-ID: <20260904124433.12840-1-f@lex.la> (raw)
In-Reply-To: <20260903010547.85469-1-f@lex.la>

Since 99a1f9ae10 (push: add reflog check for "--force-if-includes",
2020-10-03), is_reachable_in_reflog() stops walking the reflog of the
local branch at entries older than the newest reflog entry of the
remote-tracking ref. That timestamp is read by a callback of
refs_for_each_reflog_ent_reverse() into a variable that is never
initialized, so when the remote-tracking ref has no reflog the walk
is cut off at whatever happens to be on the stack.

With the files backend a remote-tracking ref created by "git clone"
has no reflog and does not get one until it moves. On my machine the
leftover value exceeds any real timestamp: the walk stops at the very
first entry, never reaches the "Created from" entry that "checkout
--track" wrote, and the push is rejected with "remote ref updated
since checkout" although nothing on the remote has changed.

Initialize the timestamp to zero, so that a remote-tracking ref
without reflog makes the walk cover the whole reflog of the local
branch, as documented.

Assisted-by: LLM
Signed-off-by: Aleksei Sviridkin <f@lex.la>
---
Changes since v1:
  - sign-off is now the last trailer
  - test_when_finished moved ahead of the setup so a failed init, push
    or clone still cleans up

 remote.c            |  2 +-
 t/t5533-push-cas.sh | 18 ++++++++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/remote.c b/remote.c
index 00723b385e..6d301698ca 100644
--- a/remote.c
+++ b/remote.c
@@ -2751,7 +2751,7 @@ static int check_and_collect_until(const char *refname UNUSED,
  */
 static int is_reachable_in_reflog(const char *local, const struct ref *remote)
 {
-	timestamp_t date;
+	timestamp_t date = 0;
 	struct commit *commit;
 	struct commit **chunk;
 	struct check_and_collect_until_cb_data cb;
diff --git a/t/t5533-push-cas.sh b/t/t5533-push-cas.sh
index cba26a872d..bb8878c593 100755
--- a/t/t5533-push-cas.sh
+++ b/t/t5533-push-cas.sh
@@ -396,4 +396,22 @@ test_expect_success '"--force-if-includes" should allow deletes' '
 	)
 '
 
+test_expect_success '"--force-if-includes" should allow forced update when remote-tracking ref has no reflog' '
+	rm -fr dst src &&
+	test_when_finished "rm -fr dst src" &&
+	git init --bare dst &&
+	git push dst main main:branch &&
+	git clone --no-local dst src &&
+	(
+		cd src &&
+		# a clone leaves the remote-tracking refs without reflog
+		# entries with the files backend, but not with reftable
+		git reflog expire --all --expire=all &&
+		git switch -c branch --track origin/branch &&
+		git reset --hard HEAD^ &&
+		test_commit D &&
+		git push --force-if-includes --force-with-lease="branch"
+	)
+'
+
 test_done

base-commit: e9019fcafe0040228b8631c30f97ae1adb61bcdc
-- 
2.55.0


  parent reply	other threads:[~2026-09-04 12:44 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-03  1:05 [PATCH] push: fix --force-if-includes when remote-tracking ref has no reflog Aleksei Sviridkin
2026-09-03 16:16 ` Junio C Hamano
2026-09-03 20:00   ` Aleksei Sviridkin
2026-09-03 20:11     ` Junio C Hamano
2026-09-03 21:45       ` Aleksei Sviridkin
2026-09-04  1:03     ` Kristoffer Haugsbakk
2026-09-04 16:48     ` Junio C Hamano
2026-09-05 17:13       ` Aleksei Sviridkin
2026-09-06  9:39         ` Kristoffer Haugsbakk
2026-09-06 17:14           ` Junio C Hamano
2026-09-07  4:54             ` Thomas Bachem
2026-09-07  6:23               ` Weijie Yuan
2026-09-04 12:44 ` Aleksei Sviridkin [this message]
2026-09-04 15:42   ` [PATCH v2] " Junio C Hamano
2026-09-06  0:45     ` Junio C Hamano
2026-09-06 16:50       ` Aleksei Sviridkin
2026-09-08  3:47         ` Junio C Hamano
2026-09-09  6:56           ` Aleksei Sviridkin
2026-09-10  0:57             ` Junio C Hamano
2026-09-10  8:31               ` Aleksei Sviridkin
2026-09-25 20:53               ` Tyler Cipriani
2026-09-25 21:58                 ` Junio C Hamano
2026-09-05 17:13 ` [PATCH v3] " Aleksei Sviridkin
2026-09-29  1:10   ` Tyler Cipriani
2026-09-29 18:05     ` Junio C Hamano
2026-09-29  9:13   ` [PATCH v4] " Aleksei Sviridkin
2026-09-29 16:54     ` Junio C Hamano

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=20260904124433.12840-1-f@lex.la \
    --to=f@lex.la \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.