A CLI tool to migrate GitHub repositories (from organizations or personal accounts) to a Gitea platform, built with Golang. This project leverages the GitHub and Gitea SDKs for seamless repository transfer.
- GitHub Personal Access Token with
repo
andadmin:org
scopes - Gitea Personal Access Token with
write:organization
andwrite:repository
permissions - Go 1.24+ (if building from source)
git clone https://github.com/appleboy/github2gitea
cd github2gitea
go build -o github2gitea cmd/github2gitea/main.go
Flag | Description | Default | Required |
---|---|---|---|
--gh-token |
GitHub Personal Access Token | - | Yes |
--gh-skip-verify |
Skip TLS verification for GitHub | false |
No |
--gh-server |
GitHub Enterprise Server URL | (public GitHub) | No |
--gt-server |
Gitea Server URL | https://gitea.com |
No |
--gt-token |
Gitea Personal Access Token | - | Yes |
--gt-skip-verify |
Skip TLS verification for Gitea | false |
No |
--gt-source-id |
Gitea Migration Source ID | 0 |
No |
--timeout |
Request timeout (e.g., 1m, 30s) | 10m |
No |
--source-org |
Source GitHub organization name | - | Yes |
--target-org |
Target Gitea organization name | - | Yes |
--debug |
Enable debug logging | false |
No |
--user-list |
Path to user list CSV file | - | No |
Basic migration from GitHub to Gitea.com:
./github2gitea \
--gh-token your_github_token \
--gt-token your_gitea_token \
--source-org github-org-name \
--target-org gitea-org-name
Migration with a user list CSV file:
./github2gitea \
--gh-token your_github_token \
--gt-token your_gitea_token \
--source-org github-org-name \
--target-org gitea-org-name \
--user-list users.csv
Enterprise GitHub Server migration:
./github2gitea \
--gh-server https://github.example.com \
--gh-token your_github_token \
--gt-server https://gitea.example.com \
--gt-token your_gitea_token \
--source-org enterprise-org \
--target-org new-gitea-org \
--timeout 5m \
--debug
- Validates authentication with GitHub and Gitea
- Creates target organization in Gitea (if not exists)
- Migrates all repositories from source GitHub organization
- Preserves repository metadata including:
- Description
- Visibility (public/private)
- Clone URLs
- Wiki
- Issues
- Pull requests
- Releases
- Labels
- Milestones
- If a user list CSV file is provided:
- Batch creates Gitea user accounts
- Migrates users' SSH public keys
- Preserves user role assignments
- Handles errors per-repository while continuing migration
The CSV file should have a header row and at least 5 columns per row, with the following columns in order:
- created_at (column 1, creation time, can be empty)
- id (column 2, user id, can be empty)
- login (column 3, GitHub login name)
- email (column 4, user email)
- role (column 5, user role)
Example (with header):
created_at,id,login,email,role
,1,alice,alice@example.com,admin
,2,bob,bob@example.com,user
Contributions are welcome! Please open issues or submit pull requests for improvements and bug fixes.
- Fork the repository
- Create a new branch (
git checkout -b feature/your-feature
) - Commit your changes
- Push to your fork and open a pull request
This project is licensed under the MIT License. See the LICENSE file for details.