Gitea zu Github mirror

Ich habe eine Gitea-Instanz, die ich selbst zu Hause hoste. Die meisten meiner Repositories lade ich dort hoch, dadurch finden aber leider die meisten anderen Entwickler und potenziellen Arbeitgeber meine Projekte gar nicht, da diese nicht auf meinem öffentlichen Github-Account zu finden sind.

Mirroring

Um dies mit minimalem Aufwand zu erreichen, habe ich Mirroring von git verwendet. Mirroring ist ein beliebtes Git-Konzept, das es einem Repository ermöglicht, effektiv an mehreren Orten gleichzeitig zu existieren.
Mirroring ist einfach der Akt der Spiegelung aller (oder einer bestimmten Teilmenge von) Commits, die anderswo existieren, im Allgemeinen auf automatisierte Weise.
Gitea unterstützt ein paar Git-Hooks, die eine einfache Möglichkeit bieten, ein Skript auszuführen. Die wichtigsten Hooks unterstützt Gitea:

  • pre-receive: Wird ausgeführt, wenn ein Client Code in das Repository pusht. Auf diese Weise kann z.B. verhindert werden, dass Code, Tests nicht besteht oder sogar nicht gemerged werden können.
  • update: Wird für jeden Branch ausgeführt, der aktualisiert wird, wenn ein Client Code in das Repository pusht. Dies ist ähnlich wie beim pre-receive, ermöglicht aber eine präzisere Steuerung.
  • post-receive: Läuft, nachdem pre-receive- und der update-Hook beendet ist.

Setup

  1. SSH-Keys für Gitea und Github erstellen
    1. Unterordner /opt/gitea erstellen
      mkdir -p /opt/gitea
    2. SSH Public- und Private-Key generieren
      ssh-keygen -t rsa -b 4096 -C „gitea@mc8051.de“ -f gitea
    3. Rechte dem User git geben
      chown -R git:git /opt/gitea/
    4. !!! Public-Key !!! als Deploy-Key dem Github-Repository hinzufügen
      Siehe Github-Dokumentation
  2. Einrichten des post-receive Hooks in dem zu mirroren Gitea repository

Hinweise:
Pro Repository würde ich jeweils einen neuen Key generieren, um die Sicherheit deutlich zu erhöhen!
Das Github Repository muss entweder leer sein oder die gleiche Historie besitzen.

Post-Receive Script

Für den Private-Key kann entweder der Pfad verwendet werden oder alternativ auch der Private-Key im ASCII-Armor-Format.

#!/usr/bin/env bash

downstream_repo="git@github.com:Gurkengewuerz/go-gpgit.git"
pkfile="/opt/gitea/gita"

if [ ! -e "$pkfile" ]; then # unindented block for heredoc's sake
cat > "$pkfile" << PRIVATEKEY
# ==> REMOVE THIS ENTIRE LINE & PASTE YOUR PRIVATE KEY HERE <==
PRIVATEKEY
fi

chmod 400 "$pkfile"
export GIT_SSH_COMMAND="ssh -oStrictHostKeyChecking=no -i \"$pkfile\""
git push --mirror "$downstream_repo"

Schreiben Sie einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert