What did you do before the bug happened? (Steps to reproduce your issue)
I made a reflog entry 60 days old on a branch that still contains the commit, then i asked what "git reflog expire" would prune, with no gc.reflogExpire or gc.reflogExpireUnreachable configured:
git init -q -b main repro && cd repro
t=$(date -d '60 days ago' +%s)
GIT_COMMITTER_DATE="@$t +0000" GIT_AUTHOR_DATE="@$t +0000" \
git commit -q --allow-empty -m old
git commit -q --allow-empty -m new
git reflog expire --dry-run --verbose mainWhat did you expect to happen? (Expected behavior)
The entry for "old" to be kept. The documentation of gc.reflogExpire says it defaults to 90 days, and gc.reflogExpireUnreachable to 30 days.
What happened instead? (Actual behavior)
prune commit (initial): old
keep commit: newWith -c gc.reflogExpire=90.days.ago the entry is kept.
What's different between what you expected and what actually happened?
Reachable entries expire after 30 days instead of 90. Since the total cut-off is checked first, every entry older than 30 days is now pruned, and the unreachable cut-off never matters.
Anything else you want to add:
The defaults look swapped in 85658275702b (builtin/reflog: stop storing default reflog expiry dates globaly), first released in 2.50.0. Before it, builtin/reflog.c had
default_reflog_expire_unreachable = now - 30 * 24 * 3600;
default_reflog_expire = now - 90 * 24 * 3600;and reflog.h now has
.default_expire_total = now - 30 * 24 * 3600, \
.default_expire_unreachable = now - 90 * 24 * 3600, \master still has the reflog.h version. Seen with 2.55.0 (Git for Windows 2.55.0.windows.5); the code in question is not platform specific.