So I’ve been thinking about using a self-hosted Gitea instance for a while now, but there was one thing holding me back : the import from Github.
There is an import feature in Gitea but it’s limited to single repositories, and I had around 60 to import. Needless to say I didn’t want to import them one by one, and so I went to my best friend : Google.
I found many tools for importing from Gitlab, from Gogs and other things I didn’t need, but nothing to bulk import from my Github organisation. Well, I did found one but of course it was not working.
So I dug in the Github and Gitea documentations and this is what I came up with, which worked flawlessly !
How to use
You'll need some basic dependencies
sudo apt update && sudo apt install -y git jq curl sed
The script
Here's what's inside.
#!/bin/bash GITHUB_USERNAME= GITHUB_TOKEN= GITHUB_ORGANISATION= GITEA_USERNAME= GITEA_TOKEN= GITEA_DOMAIN= GITEA_REPO_OWNER= GET_REPOS=$(curl -H 'Accept: application/vnd.github.v3+json' -u $GITHUB_USERNAME:$GITHUB_TOKEN -s "https://api.github.com/orgs/$GITHUB_ORGANISATION/repos?per_page=200&type=all" | jq -r '.[].html_url') for URL in $GET_REPOS; do REPO_NAME=$(echo $URL | sed 's|https://github.com/$GITHUB_ORGANISATION/||g') echo "Found $REPO_NAME, importing..." curl -X POST "https://$GITEA_DOMAIN/api/v1/repos/migrate" -u $GITEA_USERNAME:$GITEA_TOKEN -H "accept: application/json" -H "Content-Type: application/json" -d "{ \ \"auth_username\": \"$GITHUB_USERNAME\", \ \"auth_password\": \"$GITHUB_TOKEN\", \ \"clone_addr\": \"$URL\", \ \"mirror\": false, \ \"private\": true, \ \"repo_name\": \"$REPO_NAME\", \ \"repo_owner\": \"$GITEA_REPO_OWNER\", \ \"service\": \"git\", \ \"uid\": 0, \ \"wiki\": true}" done
How to exec
- Copy this and put it in a file named import.sh (or whatever you want)
-
Give the script execution permissions :
chmod +x import.sh
You need to fill in the variables at the top before you can run it
-
Exec !
./import.sh
If all went well, your should have transfered all of your repos to your new Gitea instance.
You made a mistake and don't want to delete the repos all one by one ? Here's the bonus script.
#!/bin/bash GITHUB_USERNAME= GITHUB_TOKEN= GITHUB_ORGANISATION= GITEA_USERNAME= GITEA_TOKEN= GITEA_DOMAIN= GITEA_REPO_OWNER= GET_REPOS=$(curl -H 'Accept: application/vnd.github.v3+json' -u $GITHUB_USERNAME:$GITHUB_TOKEN -s "https://api.github.com/orgs/$GITHUB_ORGANISATION/repos?per_page=200&type=all" | jq -r '.[].html_url') for URL in $GET_REPOS; do REPO_NAME=$(echo $URL | sed 's|https://github.com/$GITHUB_ORGANISATION/||g') echo "Deleting $REPO_NAME if it exists on Gitea ..." curl -X DELETE "https://$GITEA_DOMAIN/api/v1/repos/$GITEA_REPO_OWNER/$name" -u $GITEA_USERNAME:$GITEA_TOKEN -H "accept: application/json" done
That's all folks.
Have a good morning, and if I don't see you good afternoon, good evening and good night !
Top comments (1)
Do you have a repo where I can check out this code? Is it still on GitHub? Also, how could I modify this script to only include certain repos? Thank you.