Batch-migrate repositories between GitHub and Gitea from a Textual TUI
Project description
migtea
Batch-migrate repositories between GitHub and Gitea from a terminal UI. migtea
(migrate to Gitea) is a Textual TUI that drives
the official gh and tea CLIs: it preflights both tools, diffs your GitHub
account against a Gitea instance, lets you tick the repositories that are missing,
totals their sizes, and migrates each one (wiki, LFS, issues, and more) with
per-repo and overall progress.
Website: botmonster.com/migtea
Run it with no install:
uvx migtea
Why
Gitea's web "New Migration" page moves exactly one repository per submission.
The engine behind it has no such limit, and neither does the tea CLI's
tea repos migrate. migtea orchestrates that CLI across every repository you
select, so moving a whole account is one pass instead of one form per repo.
Requirements
migtea does not bundle or install these; it uses whatever is already on your
PATH, installed the official way:
- GitHub CLI (
gh), logged in (gh auth login). - Gitea CLI (
tea), with at least one login configured (tea login add). - uv to run
uvx migtea(orpip install migtea). gitis additionally required for the reverse (Gitea to GitHub) direction.
If a tool or login is missing, migtea's preflight screen prints the exact official command to fix it and waits for you to re-check. It never pipes a script into your shell and never installs anything itself.
What it does
- Preflight — confirms
ghandteaare present and authenticated. - Compare — inventories both accounts and buckets every repository into missing on the target or already there.
- Select — a checkbox list with a filter and fork/archived toggles; repos that already exist on the target are dimmed and unselectable.
- Confirm — shows the count and total size you are about to move.
- Migrate — runs the migration per repository with a per-repo bar and a size-weighted total bar, streaming results to a log pane.
Directions
| Direction | How | Transfers | Does not transfer |
|---|---|---|---|
| GitHub → Gitea (default) | tea repos migrate --service github |
Code, wiki, LFS, issues, labels, milestones, releases, pull requests | GitHub Actions history, Projects, Discussions, stars, webhooks, branch protection |
| Gitea → GitHub | git clone --mirror → gh repo create → git push --mirror |
Code, all branches and tags, best-effort wiki | Issues and pull requests (GitHub has no import API) |
Pass --direction gitea-to-github to reverse, or press d in the UI to flip.
Authentication
migtea never reads, prints, logs, or stores any token. GitHub auth is delegated
to gh; Gitea auth is delegated to tea. For private GitHub repositories,
migtea hands the output of gh auth token straight to tea's --auth-token
flag in memory so Gitea can clone them; the value never touches disk or the log.
Options
migtea [--direction {github-to-gitea,gitea-to-github}] [--dry-run] [--version]
--dry-run walks the entire flow but replaces the migration call with an
existence check, so you can rehearse safely before moving anything.
License
Apache-2.0.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file migtea-0.1.0.tar.gz.
File metadata
- Download URL: migtea-0.1.0.tar.gz
- Upload date:
- Size: 11.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9923ee3e15fc76afc6e21208ac3442dda90e8b40955dbbf6b2cc07054bee33b7
|
|
| MD5 |
d67418ac4222d33024160d53f280d27b
|
|
| BLAKE2b-256 |
41c0d6707ed3b3680a53356e0f4012da26a0510821acef61fe101a869f4fcfd6
|
Provenance
The following attestation bundles were made for migtea-0.1.0.tar.gz:
Publisher:
publish.yml on botmonster/migtea
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
migtea-0.1.0.tar.gz -
Subject digest:
9923ee3e15fc76afc6e21208ac3442dda90e8b40955dbbf6b2cc07054bee33b7 - Sigstore transparency entry: 2142878239
- Sigstore integration time:
-
Permalink:
botmonster/migtea@b880f23b27566e927370424eb9bd422ca62bff96 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/botmonster
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b880f23b27566e927370424eb9bd422ca62bff96 -
Trigger Event:
push
-
Statement type:
File details
Details for the file migtea-0.1.0-py3-none-any.whl.
File metadata
- Download URL: migtea-0.1.0-py3-none-any.whl
- Upload date:
- Size: 15.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
44f8994a574797b9d0904240fcd5aacff691ced62ab1bb50c0ac88da0dd796d4
|
|
| MD5 |
55b200b07f506dcdf0dd56240e142dbe
|
|
| BLAKE2b-256 |
feee594c3ac816362d971d27906577e687da22a91a16f8b9fa7dc6042fe364e3
|
Provenance
The following attestation bundles were made for migtea-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on botmonster/migtea
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
migtea-0.1.0-py3-none-any.whl -
Subject digest:
44f8994a574797b9d0904240fcd5aacff691ced62ab1bb50c0ac88da0dd796d4 - Sigstore transparency entry: 2142878281
- Sigstore integration time:
-
Permalink:
botmonster/migtea@b880f23b27566e927370424eb9bd422ca62bff96 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/botmonster
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b880f23b27566e927370424eb9bd422ca62bff96 -
Trigger Event:
push
-
Statement type: