4.8 KiB
Gitea — Tooling
All commands assume PowerShell from the project root. Load env first:
. .\.env.local.ps1
Required env vars (in .env.local.ps1, gitignored):
GITEA_URL— base URL, e.g.https://gitea-hjwh0svsoo9p5w5kj2j6b1bd.urieljareth.org.GITEA_USER— auth user (informational;GITEA_TOKENencodes the identity).GITEA_TOKEN— app token withread:repository,write:repository,read:userscopes (generate at$GITEA_URL/user/settings/applications).
Smoke test
.\gitea_skill\scripts\Test-GiteaConnection.ps1
Calls /version, /user, /settings/api, /repos/search. Exits 1 on any
FAIL — gate operational work on this.
Read-only
# Who am I?
.\gitea_skill\scripts\Invoke-GiteaApi.ps1 -Path "/user"
# List visible repos
.\gitea_skill\scripts\Get-GiteaRepo.ps1 -List
# Get one repo (owner defaults to auth user)
.\gitea_skill\scripts\Get-GiteaRepo.ps1 -Name Proxmox-Coolify-Manager
.\gitea_skill\scripts\Get-GiteaRepo.ps1 -Owner urieljareth -Name MP-Manager
# Search
.\gitea_skill\scripts\Get-GiteaRepo.ps1 -Search manager
# Branches + tags
.\gitea_skill\scripts\Invoke-GiteaApi.ps1 -Path "/repos/urieljareth/MP-Manager/branches"
.\gitea_skill\scripts\Invoke-GiteaApi.ps1 -Path "/repos/urieljareth/MP-Manager/tags"
Create a repo (idempotent)
.\gitea_skill\scripts\New-GiteaRepo.ps1 -Name my-app -Description "demo" [-Private] [-NoAutoInit]
If the repo already exists, prints its URL and returns the existing object
(no failure). -NoAutoInit skips the Gitea-side README so you can push an
existing local history without conflicts.
Push a local repo to Gitea (headless, token NOT persisted)
.\gitea_skill\scripts\Sync-GiteaRemote.ps1 `
-AppPath .\my-app `
-Name my-app `
-RemoteName gitea `
-CreateIfMissing [-Private] [-Force]
What it does:
- Ensures
urieljareth/<Name>exists (creates if-CreateIfMissing). - Adds (or updates) the
gitearemote with the clean HTTPS URL — no token in.git/config. - Pushes the current branch with a one-shot
http.extraHeader=Authorization: token <T>and a blankedcredential.helper. The token never reaches disk.
-RemoteName gitea (default) coexists with a GitHub origin. To replace an
existing origin that already points at Gitea (as in this manager repo),
pass -RemoteName origin.
If you prefer wincred for interactive pushes (one-time)
cmdkey /generic:"git:$env:GITEA_URL" /user:"$env:GITEA_USER" /pass:"$env:GITEA_TOKEN"
After that, plain git push works. The skill scripts do NOT require this —
they work headlessly out of the box.
Low-level API
# GET
.\gitea_skill\scripts\Invoke-GiteaApi.ps1 -Path "/repos/urieljareth/MP-Manager/releases"
# POST with body
$body = @{ name = "v1.0.0"; tag_name = "v1.0.0" } | ConvertTo-Json -Compress
.\gitea_skill\scripts\Invoke-GiteaApi.ps1 -Method POST `
-Path "/repos/urieljareth/MP-Manager/releases" -BodyJson $body
# Raw (status + headers + body string)
.\gitea_skill\scripts\Invoke-GiteaApi.ps1 -Path "/user" -Raw
Invoke-GiteaApi.ps1 uses curl.exe --data-binary @<tmpfile> (UTF-8 no BOM)
so Gitea's JSON parser never trips on a BOM — same pattern as
Invoke-GitHubApi.ps1.
Commands that always require confirmation
- Creating a repo (
New-GiteaRepo.ps1warns if it already exists). - Any
git push(Sync-GiteaRemote.ps1asks unless-Force). - Any Gitea
POST/PATCH/DELETE(repo, release, hook, branch protection). - Mirror/migrate operations.
- Deleting a repo (no Coolify-side recycle bin — data is gone).
-Force skips the interactive prompts. Use only after manually reviewing the plan.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
GITEA_TOKEN not set |
.env.local.ps1 not loaded |
. .\.env.local.ps1 |
401/403 on writes |
Token lacks write:repository |
Regenerate token with the right scope at $GITEA_URL/user/settings/applications |
invalid character '\u00ef' |
Body sent with a BOM | Already handled by Invoke-GiteaApi.ps1 (uses [IO.File]::WriteAllText no-BOM); do not switch to Set-Content -Encoding utf8 |
git push prompts for credentials |
The one-shot header was overridden by a stored helper | The script blanks credential.helper for the push; if you configured wincred manually, that's fine too. If a different helper intercepts, run from a clean shell. |
404 creating repo under an org |
Org does not exist or token lacks access | Create the org first at $GITEA_URL/org/create |
| Cloudflare 5xx on Gitea URL | Tunnel routing or the Gitea container is down | coolify_skill/scripts/Get-CoolifyDockerStatus.ps1 -Filter gitea; tunnel is dashboard-managed, see docs/runbooks/cloudflare-tunnel.md |