Ce tutoriel détaille un script Python pour migrer des dépôts de Gitea vers GitLab. Il couvre l’extraction des dépôts, leur clonage, la création dans GitLab et la poussée finale.
🌘 Prérequis
Comment migrer des dépôts Git de Gitea vers GitLab avec Python ?
La migration de Gitea vers GitLab s’effectue avec un script Python utilisant les bibliothèques requests, pandas, subprocess et os. Le script extrait la liste des dépôts via l’API Gitea, clone chaque dépôt localement, crée le dépôt correspondant dans GitLab (public ou privé selon le namespace), puis pousse le code vers GitLab. Il faut préalablement obtenir des jetons API pour les deux plateformes.
Avant d’exécuter le script, assure-toi :
- Avoir Python installé avec les bibliothèques
requests,pandas,subprocessetos. - Obtenir des jetons API pour Gitea et GitLab.
- Créer deux groupes dans GitLab :
personnel(namespace_id: 4) pour les dépôts privés etpartage(namespace_id: 5) pour les publics.
🌘 Chargement des librairies de code Python requises pour ce projet
import requests
import pandas
import subprocess
import os
🌘 Configuration des jetons API pour Gitea et GitLab
Remplace les chaînes vides par tes jetons API réels.
gitea_token = ""
gitlab_token = ""
🌘 Configuration du répertoire de travail
Créez un répertoire pour stocker les dépôts clonés.
os.mkdir("./git_repos")
os.chdir("./git_repos")
Vérifiez le répertoire actuel :
os.getcwd()
🌘 Extraction des répertoires à déménager et de leur statut public ou privé
Définissez la page à extraire (Gitea pagine les résultats par 30).
page = 1
Récupérez les dépôts via l’API Gitea :
repos = requests.get('https://utilisateur:' + gitea_token + '@apps.mondomaine.com/gitea/api/v1/user/repos?page=' + str(page))
Convertissez la réponse en DataFrame pandas :
repos_data = pandas.read_json(repos.content)
Extrayez les colonnes pertinentes :
urls = repos_data[['name', 'clone_url', 'private']]
🌘 Clone des répertoires de Gitea vers le répertoire de travail
Modifiez les URLs pour inclure l’authentification :
urls.loc[:, "fixed_url"] = [myurl.replace("https://", "https://utilisateur:" + gitea_token + "@") for myurl in urls.clone_url]
Clonez chaque dépôt en mode bare :
for i in urls.fixed_url:
print(i)
subprocess.run(['git', 'clone', '--bare', i])
🌘 Création des nouveaux répertoires dans GitLab via API
Créez les dépôts dans GitLab en fonction de leur visibilité :
for index, row in urls.iterrows():
print(row['name'] + '.git')
if row['private']:
new_repo = requests.post('https://git.mondomaine.com/api/v4/projects', data={"private_token": gitlab_token, "name": row['name'], "namespace_id": 4})
else:
new_repo = requests.post('https://git.mondomaine.com/api/v4/projects', data={"private_token": gitlab_token, "name": row['name'], "namespace_id": 5})
print(str(new_repo.status_code) + ': ' + new_repo.reason)
🌘 Pousser les nouveaux répertoires vers GitLab avec git push
Poussez les dépôts vers GitLab en utilisant l’option mirror :
for index, row in urls.iterrows():
if row['private']:
remote_url = 'https://oauth2:' + gitlab_token + '@git.mondomaine.com/personnel/' + row['name'] + '.git'
else:
remote_url = 'https://oauth2:' + gitlab_token + '@git.mondomaine.com/partage/' + row['name'] + '.git'
print(remote_url)
os.chdir("./" + row['name'] + '.git')
subprocess.run(['git', 'push', '--mirror', remote_url])
os.chdir("../")
Une fois exécuté, tous vos dépôts seront migrés vers GitLab dans les groupes appropriés.