fix(gitmirrors): n8n cannot have a main on codeberg, so stop asking for one #642

Merged
binjovi-bot merged 1 commit from fix/n8n-main-refname-conflict into trunk 2026-09-11 13:22:51 +00:00
Owner

sean/n8n has failed every push since 2026-09-01. The reason was never legible until the transport was forced down to HTTP/1.1:

remote: error: 'refs/heads/main/handshake-tomi-feedback' exists;
        cannot create 'refs/heads/main'

A git ref cannot be both a file and a directory. Codeberg someara/n8n is a full fork of upstream — 3083 branches — and one of them is literally named main/handshake-tomi-feedback, so refs/heads/main can never exist beside it. The push is atomic, so that single rejected ref took trunk and master down with it for ten days.

HTTP/2 hid it

Every earlier attempt reported only:

error: RPC failed; curl 92 HTTP/2 stream 5 reset by server (error 0x8 CANCEL)
send-pack: unexpected disconnect while reading sideband packet

which reads like a size or network fault on a 441 MB repository — and sent the first diagnosis entirely the wrong way, toward seeding the branches by hand.

Dropping main costs no content

Forgejo main be6fad77
Forgejo trunk be6fad77the same commit
Codeberg trunk be6fad77 — backed up, carries the content

The alternative was deleting that upstream branch from the backup: a destructive write to the off-cluster copy to buy a duplicate ref. Upstream n8n-io/n8n still has the commit, so it would have been recoverable — it is simply not a trade worth making when the content is already backed up under another name.

The exemption is recorded, not silent

tests/gitmirror-fleet.sh required both main and trunk for six repositories. n8n now has its own case:

  • it must name trunk — so the content stays backed up
  • it must not name main — so this cannot be "helpfully" restored and break the mirror again

Both halves refute: restoring main turns the guard red, and dropping trunk turns it red.

If main and trunk ever diverge here, clear the conflict on Codeberg and put main back in both places — the file and the guard say so.

How it was found

While measuring delivery for the push-mirror migration to binjovi. Every guard in this repository reads the tree, and the tree was self-consistent here too: the CR and the live Forgejo mirror both said main,trunk,master. What disagreed was the destination.

This is the last of four mirrors that were failing to deliver; the fleet is 38/38 once this lands.

https://claude.ai/code/session_01TdW5FSvRJW8CtGnpd29Xp8

`sean/n8n` has failed every push since **2026-09-01**. The reason was never legible until the transport was forced down to HTTP/1.1: ``` remote: error: 'refs/heads/main/handshake-tomi-feedback' exists; cannot create 'refs/heads/main' ``` A git ref cannot be both a file and a directory. Codeberg `someara/n8n` is a full fork of upstream — **3083 branches** — and one of them is literally named `main/handshake-tomi-feedback`, so `refs/heads/main` can never exist beside it. The push is **atomic**, so that single rejected ref took `trunk` and `master` down with it for ten days. ## HTTP/2 hid it Every earlier attempt reported only: ``` error: RPC failed; curl 92 HTTP/2 stream 5 reset by server (error 0x8 CANCEL) send-pack: unexpected disconnect while reading sideband packet ``` which reads like a size or network fault on a 441 MB repository — and sent the first diagnosis entirely the wrong way, toward seeding the branches by hand. ## Dropping `main` costs no content | | | |---|---| | Forgejo `main` | `be6fad77` | | Forgejo `trunk` | `be6fad77` — **the same commit** | | Codeberg `trunk` | `be6fad77` — backed up, carries the content | The alternative was deleting that upstream branch from the backup: a destructive write to the off-cluster copy to buy a duplicate ref. Upstream `n8n-io/n8n` still has the commit, so it would have been recoverable — it is simply not a trade worth making when the content is already backed up under another name. ## The exemption is recorded, not silent `tests/gitmirror-fleet.sh` required both `main` and `trunk` for six repositories. `n8n` now has its own case: - it **must** name `trunk` — so the content stays backed up - it **must not** name `main` — so this cannot be "helpfully" restored and break the mirror again Both halves refute: restoring `main` turns the guard red, and dropping `trunk` turns it red. If `main` and `trunk` ever diverge here, clear the conflict on Codeberg and put `main` back in both places — the file and the guard say so. ## How it was found While measuring delivery for the push-mirror migration to binjovi. Every guard in this repository reads the tree, and **the tree was self-consistent here too**: the CR and the live Forgejo mirror both said `main,trunk,master`. What disagreed was the destination. This is the last of four mirrors that were failing to deliver; the fleet is 38/38 once this lands. https://claude.ai/code/session_01TdW5FSvRJW8CtGnpd29Xp8
fix(gitmirrors): n8n cannot have a main on codeberg, so stop asking for one
All checks were successful
binjovi/ci Binjovi completed the frozen plan
ba5a4d39ec
sean/n8n has failed every push since 2026-09-01. The reason was never legible
until the transport was forced down to HTTP/1.1:

  remote: error: 'refs/heads/main/handshake-tomi-feedback' exists;
          cannot create 'refs/heads/main'

A git ref cannot be both a file and a directory. codeberg someara/n8n is a full
fork of upstream -- 3083 branches -- and one of them is literally named
`main/handshake-tomi-feedback`, so `refs/heads/main` can never exist beside it.
The push is ATOMIC, so that single rejected ref took trunk and master down with
it for ten days.

HTTP/2 HID IT. Every earlier attempt reported only

  error: RPC failed; curl 92 HTTP/2 stream 5 reset by server (error 0x8 CANCEL)
  send-pack: unexpected disconnect while reading sideband packet

which reads like a size or network fault on a 441 MB repository, and sent the
first diagnosis entirely the wrong way -- towards seeding the branches by hand.

DROPPING `main` COSTS NO CONTENT. Forgejo's main and trunk are the same commit,
be6fad77, and trunk is backed up and carries it. The alternative was deleting
that upstream branch from the backup: a destructive write to the off-cluster copy
to buy a duplicate ref. Upstream n8n-io/n8n still has the commit, so it would
have been recoverable -- it is simply not a trade worth making when the content
is already backed up under another name.

THE EXEMPTION IS RECORDED, NOT SILENT. tests/gitmirror-fleet.sh required both
main and trunk for six repositories. n8n now has its own case: it must name
trunk, and it must NOT name main, so neither half can rot. Both refute --
restoring main turns the guard red, and dropping trunk turns it red.

Found while measuring delivery for the push-mirror migration to binjovi. Every
guard in this repository reads the tree, and the tree was self-consistent here
too: the CR and the live Forgejo mirror both said main,trunk,master. What
disagreed was the destination.

Claude-Session: https://claude.ai/code/session_01TdW5FSvRJW8CtGnpd29Xp8
binjovi-bot deleted branch fix/n8n-main-refname-conflict 2026-09-11 13:22:52 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
sean/seanfarm!642
No description provided.