Wie klont man alle Repos auf einmal von GitHub?

Lesezeit: 6 Minuten

Wie klont man alle Repos auf einmal von GitHub
numb3rs1x

Ich habe ein GitHub-Firmenkonto und möchte alle darin enthaltenen Repositories sichern und dabei alles berücksichtigen, was zu Automatisierungszwecken neu erstellt werden könnte. Ich hatte auf sowas gehofft:

git clone [email protected]:company/*.git 

oder ähnliches würde funktionieren, aber es scheint den Platzhalter dort nicht zu mögen.

Gibt es in Git eine Möglichkeit, alles zu klonen und dann zu ziehen, vorausgesetzt, man hat die entsprechenden Berechtigungen?

  • Gute Frage. Und wie wäre es, sie per Pull synchron zu halten? Funktioniert eine der Antworten für Pulls?

    – nealmcb

    17. Mai 2015 um 17:37 Uhr

  • Wir brauchen eine Python-Lösung, für diejenigen von uns, die mit Nodes oder Ruby nicht so vertraut sind 😉 Oder Github sollte dies lesen und Mitleid mit uns haben und einfach eine einfache Webschnittstelle dafür bereitstellen ….

    – nealmcb

    18. Mai 2015 um 3:33 Uhr


  • Versuchen: github.com/wballard/git-friends

    – kenorb

    26. September 2015 um 22:59 Uhr

  • Sie können verwenden gorg dann einfach ghorg clone org --backup --clone-wiki --token=xxxx

    – Jimjam

    10. November 2021 um 16:02 Uhr

Ich glaube nicht, dass es so möglich ist. Am besten suchen und durchlaufen Sie mithilfe der API eine Liste der Repositories einer Organisation.

Versuche dies:

  • Erstellen Sie ein API-Token, indem Sie zu Kontoeinstellungen -> Anwendungen gehen
  • Rufen Sie an: http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
  • Die Antwort ist ein JSON-Array von Objekten. Jedes Objekt enthält Informationen über eines der Repositories unter dieser Organisation. Ich denke, in Ihrem Fall werden Sie gezielt nach dem suchen ssh_url Eigentum.
  • Dann git clone jeder von denen ssh_urlS.

Es ist ein wenig zusätzliche Arbeit, aber es ist notwendig, dass GitHub über eine ordnungsgemäße Authentifizierung verfügt.

  • Ich habe das API-Token erstellt und erhalte eine Ausgabe des Aufrufs, aber ich sehe nichts, was auf das verweist, was ich über unsere Repositories oder die Zeichenfolge „ssh_url“ weiß. Ich vermute, dass ich den Anruf nicht richtig gemacht habe. curl -i https://github.com/api/v3/orgs/company/repos?access_token=<token>

    – numb3rs1x

    24. Oktober 2013 um 21:59 Uhr


  • Ist dies ein GitHub Enterprise-Konto oder github.com?

    – Thomas Kelly

    24. Oktober 2013 um 22:05 Uhr

  • Ach, ich habe dich falsch verstanden. Ich dachte, es wäre ein Enterprise-Konto. Anstatt https://github.com/api/v3/Versuchen https://api.github.com/.

    – Thomas Kelly

    24. Oktober 2013 um 22:08 Uhr

  • Und ich bin mir nicht sicher, wie Ihr spezielles Unternehmen eingerichtet ist, aber wenn es sich um einen “Benutzer” anstelle einer “Organisation” handelt, sollten Sie die verwenden /users/${COMPANY}/repos Weg statt /orgs/${COMPANY}/repos.

    – Thomas Kelly

    24. Oktober 2013 um 22:10 Uhr

  • Per GitHub: Bitte verwenden Sie stattdessen den Autorisierungs-HTTP-Header, da Sie die verwenden access_token Abfrageparameter ist veraltet. Wenn dieses Token von einer App verwendet wird, über die Sie keine Kontrolle haben, beachten Sie, dass es aufgrund dieser Einstellung möglicherweise nicht mehr funktioniert.

    – BogeyMan

    24. Juni 2020 um 19:43 Uhr

  • per_page=1000 ist maximal 100

    – aehlke

    27. Dezember 2019 um 18:57 Uhr

  • Wenn es nicht Ihre eigene Organisation ist, versuchen Sie es hinzuzufügen sed 's/[email protected]:/https:\/\/github.com\//g' wie folgt: curl "GHORG=company; https://api.github.com/orgs/$GHORG/repos?per_page=1000" | grep -o '[email protected][^"]*' | sed 's/[email protected]:/https:\/\/github.com\//g' | xargs -L1 git clone

    – Wurzel

    19. Dezember 2021 um 21:53 Uhr

Wie klont man alle Repos auf einmal von GitHub
RichVel

Einfaches Skript mit GitHub CLI (keine API-Schlüssel)

Hier ist eine einfache Lösung mit dem offiziellen GitHub-CLI-Tool: gh – Keine Notwendigkeit für API-Schlüssel und kann eine beliebige Anzahl von privaten Repos verarbeiten:

# 1. Login with gh for private repos, and follow prompts
gh auth login

# 2. Clone (or update) up to 1000 repos under `./myorgname` folder
#    [replace 'myorgname' with your org name and increase repo limit if needed]
gh repo list myorgname --limit 1000 | while read -r repo _; do
  gh repo clone "$repo" "$repo"
done

Aufstellen

Um das zu bekommen GitHub-CLI-Tool:

Das GitHub-CLI-Tool wird langfristig unterstützt, wenn sich die GitHub-API ändert.

Optional: Aktualisieren Sie vorhandene Checkouts

Um Repo-Ordner, die sich bereits auf der Festplatte befinden, zu aktualisieren und neue Repos hinzuzufügen, müssten Sie prüfen, ob die gh repo clone – Ersetzen Sie diese Zeile durch:

    gh repo clone "$repo" "$repo" -- -q 2>/dev/null || (
        cd "$repo"
        # Handle case where local checkout is on a non-main/master branch
        # - ignore all errors because some repos may have zero commits, 
        # so no main or master
        set +e
        git checkout -q main 2>/dev/null
        git checkout -q master 2>/dev/null
        git pull -q
        set -e
    )

Hintergrund

  • Eine tolle Lösung IMO. Ich habe den größten Teil des Morgens damit verbracht, genau dies zu tun (eine Lösung mit gh), weil ich es versäumt habe, zur zweiten Seite der Antworten zu gehen. Ich hoffe, dass dies positiv bewertet wird, damit andere den gleichen Fehler nicht wiederholen.

    – Pranasas

    10. September 2021 um 13:19 Uhr

  • Bei weitem die am einfachsten zu implementierende Lösung.

    – Ketouem

    22. November 2021 um 10:38 Uhr

Wie klont man alle Repos auf einmal von GitHub
kenorb

Dieses Wesentliche führt die Aufgabe in einer Zeile auf der Befehlszeile aus:

curl -s https://api.github.com/orgs/[your_org]/repos?per_page=200 | ruby -rubygems -e 'require "json"; JSON.load(STDIN.read).each { |repo| %x[git clone #{repo["ssh_url"]} ]}'

Ersetzen [your_org] mit dem Namen Ihrer Organisation. Und stellen Sie Ihre ein per_page im Bedarfsfall.

AKTUALISIEREN:

Wie ATutorMe erwähnt hat, beträgt die maximale Seitengröße 100, gemäß den GitHub-Dokumenten.

Wenn Sie mehr als 100 Repos haben, müssen Sie eine hinzufügen page Parameter zu Ihrer URL hinzufügen und Sie können den Befehl für jede Seite ausführen.

curl -s "https://api.github.com/orgs/[your_org]/repos?page=2&per_page=100" | ruby -rubygems -e 'require "json"; JSON.load(STDIN.read).each { |repo| %x[git clone #{repo["ssh_url"]} ]}'

Hinweis: Die Standardeinstellung per_page Parameter ist 30.

  • Eine tolle Lösung IMO. Ich habe den größten Teil des Morgens damit verbracht, genau dies zu tun (eine Lösung mit gh), weil ich es versäumt habe, zur zweiten Seite der Antworten zu gehen. Ich hoffe, dass dies positiv bewertet wird, damit andere den gleichen Fehler nicht wiederholen.

    – Pranasas

    10. September 2021 um 13:19 Uhr

  • Bei weitem die am einfachsten zu implementierende Lösung.

    – Ketouem

    22. November 2021 um 10:38 Uhr

1646308088 336 Wie klont man alle Repos auf einmal von GitHub
Kirby

Also werde ich meine Antwort auch hinzufügen. 🙂 (Ich fand es einfach)

Abrufliste (ich habe die Firma “Magento” verwendet):

curl -si https://api.github.com/users/magento/repos | grep ssh_url | cut -d '"' -f4

Verwenden clone_url stattdessen ssh_url HTTP-Zugriff verwenden.

Klonen wir sie also alle! 🙂

curl -si https://api.github.com/users/magento/repos | \
    grep ssh_url | cut -d '"' -f4 | xargs -i git clone {}

Wenn Sie private Repos abrufen möchten, fügen Sie einfach den GET-Parameter hinzu ?access_token=YOURTOKEN

923060cookie-checkWie klont man alle Repos auf einmal von GitHub?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy