Compatibility
Gitea has a built-in migration form for GitHub repositories. Beyond the Git data, it can bring over items such as issues and pull requests, for which you have to enter at least your GitHub username. The migration page does not list everything the form imports.
Gitea Actions is designed to be compatible with GitHub Actions. Workflow files use the same syntax, ${{ github.xyz }} expressions keep working (the docs recommend gitea.xyz but both behave the same today), and actions referenced without a host, like actions/checkout@v4, are downloaded from github.com by default.
Before you switch
- Migrate each repository from Create… > New Migration, choosing GitHub as the service and entering the repository URL and credentials.
- To keep GitHub as the source for a while, tick This repository will be a mirror. Gitea then pulls periodically, and Synchronize Now in the repository settings forces a sync.
- Set up CI. Gitea Actions needs Gitea 1.19 or later and is on by default since 1.21, but jobs only run on a Gitea Runner you register yourself with
./runner register --instance <instance> --token <token>, at instance, organization or repository level. - Enable Enable Repository Actions in each repository’s settings: repositories have Actions off by default.
- Check your workflows against the differences below. The quickstart places workflow files in
.gitea/workflows/.
Pitfalls
- The migration guide covers the repository, not the platform around it. It says nothing about Actions secrets and variables, runners, or organization settings, so plan those separately.
- A pull mirror can only be set up when the repository is created. An existing repository cannot be turned into one later.
- A push mirror back to GitHub force-pushes and overwrites the remote, and Gitea has no SSH push mirrors.
jobs.<job_id>.environmentis ignored, and problem matchers and error annotations are dropped.- The
permissionsscopesstatuses,checks,deployments,id-token,security-eventsandpagesare not supported. GITEA_TOKENcannot publish to the repository’s package registry, for example to push an OCI image. Use a personal access token.- For
pull_requestevents the ref isrefs/pull/<n>/head, not GitHub’s merge previewrefs/pull/<n>/merge, so a job tests the branch head rather than the merge result. - Gitea’s FAQ lists the trigger events it supports. Check any other event your workflows rely on.