Я недавно сделал шаг, для разнообразных Причины из общедоступного профиля GitHub в инфраструктуру Private Git. Одним из решений, которые я пытался, была GITEA, OpenSource, самостоятельно размещенное решение с таковым интерфейсом Jui и очень доступным API.
Gitea имеет объекты в UI для импорта репозиториев, но у меня было много репо, чтобы воссоздать, и хотела быстро перенести мигрировать, поэтому я написал скрипт, чтобы потреблять оба конца API:
Импортируйте клиент Python Github и ОС
, Reests
и JSON
Пакеты в ваш скрипт, и плагин ваш Github и Gitea и конечная точка (адрес сервера) информация:
from github import Github import os import json import requests #Github GH_ACCESS_TOKEN = os.environ['GH_ACCESS_TOKEN'] #Gitea GITEA_ACCESS_TOKEN = os.environ['GITEA_ACCESS_TOKEN'] GITEA_USER = "" GITEA_PASS = "" TARGET_HOST = "https://git.yourserver.co" MIGRATE_URI = "/api/v1/repos/migrate" ENDPOINT = "%s%s" % (TARGET_HOST, MIGRATE_URI) g = Github(GH_ACCESS_TOKEN) EXCLUDE = []
и в Исключить
Поместите в списке коммерческих именных имен REPO из GitHub, вы не хотите мигрировать, то есть.
EXCLUDE = ["repo1", "repo2"...]
Наша первая функция будет просто построить список ваших REPOS, а некоторая соответствующая информация, относящаяся к GITEA, необходимой для создания нового репо, в основном, только имени, описание, независимо от того, является ли он частным, а URL клон от:
def getRepos(g): repos = [] for repo in g.get_user().get_repos(): r = {} r['name'] = str(repo.name) r['url'] = str(repo.url) r['description'] = str(repo.description) r['private'] = str(repo.private) repos.append(r) return repos
Это возвращает список словарей, структурированных как:
{"name": "repo_name", "url": "https://github.com/...", ... }
Следующая функция, которую мы запустим, будет глотать, как то, как указано выше, чтобы создать новый региператив:
def createRepo(source_url,name,description,private): headers = { "accept": "application/json", "content-type": "application/json" } headers["Authorization"] = "token %s" % (GITEA_ACCESS_TOKEN) migrate_data = { "mirror": "false", "uid": 1 } migrate_data["auth_password"] = "%s" % (GITEA_PASS) migrate_data["auth_username"] = "%s" % (GITEA_USER) migrate_data["description"] = "%s" % (description) migrate_data["repo_name"] = "%s" % (name) migrate_data["private"] = "%s" % (private) migrate_data["clone_url"] = "%s" % (source_url) ...
Вышеуказанное создает необходимые заголовки аутентификации, а затем тело запроса с данными REPO, которые мы указали в Гетрепос
функция. Мы закончим эту функцию, отправив этот запрос:
... try: r = requests.post(url=ENDPOINT, data=json.dumps(migrate_data), headers=json.dumps(headers)) if r.status_code != 200: return "Non-OK Response: %s" % (r.status_code) else: return "Done: %s" % (source_url) except Exception as e: return e
Теперь, чтобы соединить эти две задачи вместе, мы собираемся создать обработчик для создания списка репозитория, а затем создать нашу вторую функцию для создания нового репо, от него:
def runMigration(r,x): exclude_repos = x for repo in r: if repo not in exclude_repos: print "Working on %s" % (repo['name']) print createRepo(repo['url'],repo['name'],repo['description'],repo['private']) else: print "Excluding %s" % (repo['name']) return "Done"
Вы увидите, что это итасирует список репо, проверяет, что вы не исключали его, а затем создают новое репо.
Сделайте все это вместе, это будет выглядеть так, и будь готов бежать:
Github Migration Script.
Для всего, что ваше заданное решение Git, скрипт, подобный этому, может также обрабатывать данные из GitHub, и создают новые репо, на новом хосте (если у него есть API, аналогичный поток для вашего CreateRepo
функция, вероятно, хватит! Тем не менее, вы можете использовать эти данные ФРС и использовать библиотеку, как Gitpython Чтобы создать новый клон локально и т. Д.) – Это может помочь сделать такой переход к децентрализованной платформе только что намного более безболезненно!
Оригинал: “https://dev.to/jmarhee/migrating-from-github-to-gitea-26ei”