mr merge updates the target ref with gitutil.UpdateRefCAS
(internal/control/mr.go), which bypasses receive-pack. Everything that
hangs off a ref update therefore never runs for a merge performed over
SSH, the CLI, the web UI, or the API:
- no webhook —
postReceiverecords thepushevent that webhooks subscribe to (internal/hookd/hookd.go, "Every ref update is an event webhooks can subscribe to"). A merge recordsmr.mergedand nothing else, so a subscriber watchingpushnever hears that main moved. - no builds —
queueBuildsreads.gitbay/ci.ymland creates one build per job on a branch push. A merge queues none, so CI silently skips exactly the commits that land on the default branch. - no push mirrors —
MarkMirrorsDirty(repoID, "push")is not called, so a mirrored repo does not sync after a merge.
The issue-reference and landed-commit work is already duplicated into the
merge path, which is what makes the omission easy to miss: closes #N in
a commit message works on merge, but CI does not.
Concretely: merging an MR into a repo with a .gitbay/ci.yml runs
nothing, and pushing the identical commit to the same branch runs the
whole config.
Found while trying to trigger a site deploy from a merge in krz/krz.sh.
closed by commit 5460cca8a5 by cmc: Fire the ref-update work when a merge moves a branch
2026-08-31 20:58 UTC