Bagaimana cara mengkloning semua repo sekaligus dari GitHub?

97

Saya memiliki akun GitHub perusahaan dan saya ingin mencadangkan semua repositori di dalamnya, memperhitungkan semua hal baru yang mungkin dibuat untuk tujuan otomatisasi. Saya berharap sesuatu seperti ini:

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

atau serupa akan berfungsi, tetapi tampaknya tidak menyukai karakter pengganti di sana.

Adakah cara di Git untuk mengkloning dan menarik semuanya dengan asumsi seseorang memiliki izin yang sesuai?

numb3rs1x
sumber
2
Pertanyaan bagus. Dan bagaimana dengan menjaga agar tetap sinkron, melalui tarikan? Apakah ada jawaban yang cocok untuk tarikan?
nealmcb
Kami membutuhkan solusi python, bagi kami yang tidak begitu mahir di node atau ruby;) Atau github harus membaca ini dan kasihan pada kami dan hanya menyediakan antarmuka web sederhana untuk ini ....
nealmcb

Jawaban:

52

Saya rasa tidak mungkin melakukannya dengan cara itu. Taruhan terbaik Anda adalah menemukan dan mengulang melalui daftar repositori Organisasi menggunakan API.

Coba ini:

  • Buat token API dengan membuka Pengaturan Akun -> Aplikasi
  • Telepon ke: http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
  • Responsnya akan berupa larik objek JSON. Setiap objek akan menyertakan informasi tentang salah satu repositori di bawah Organisasi itu. Saya pikir dalam kasus Anda, Anda akan mencari ssh_urlproperti secara khusus.
  • Kemudian git clonemasing-masing ssh_urls.

Ini sedikit pekerjaan ekstra, tetapi GitHub perlu memiliki otentikasi yang tepat.

Thomas Kelley
sumber
Saya membuat token API dan saya mendapatkan output dari panggilan tersebut, tetapi saya tidak melihat apa pun yang merujuk pada apa yang saya ketahui tentang repositori atau string 'ssh_url'. Saya curiga saya tidak melakukan panggilan dengan benar. curl -i https://github.com/api/v3/orgs/company/repos?access_token=<token>
numb3rs1x
Apakah ini akun GitHub Enterprise, atau github.com?
Thomas Kelley
1
Ah, saya salah paham. Saya pikir itu adalah akun Perusahaan. Alih-alih https://github.com/api/v3/, coba https://api.github.com/.
Thomas Kelley
1
Dan saya tidak yakin bagaimana perusahaan Anda disiapkan, tetapi jika itu adalah "pengguna" dan bukan "organisasi", Anda akan ingin menggunakan /users/${COMPANY}/reposjalur, bukan /orgs/${COMPANY}/repos.
Thomas Kelley
1
Per GitHub: Gunakan header HTTP Otorisasi sebagai gantinya, karena menggunakan access_tokenparameter kueri sudah tidak digunakan lagi. Jika token ini digunakan oleh aplikasi yang tidak Anda kendalikan, ketahuilah bahwa token ini mungkin berhenti berfungsi karena penghentian ini.
BogeyMan
114

Di Windows dan semua sistem UNIX / LINUX , menggunakan Git Bash atau Terminal lainnya , ganti YOURUSERNAMEdengan nama pengguna Anda dan gunakan:

CNTX={users|orgs}; NAME={username|orgname}; PAGE=1
curl "https://api.github.com/$CNTX/$NAME/repos?page=$PAGE&per_page=100" |
  grep -e 'git_url*' |
  cut -d \" -f 4 |
  xargs -L1 git clone
  • Setel CNTX=usersdan NAME=yourusername, untuk mengunduh semua repositori Anda.
  • Setel CNTX=orgsdan NAME=yourorgname, untuk mengunduh semua repositori organisasi Anda.

Ukuran halaman maksimum adalah 100, jadi Anda harus memanggil ini beberapa kali dengan nomor halaman yang benar untuk mendapatkan semua repositori Anda (setel PAGEke nomor halaman yang diinginkan yang ingin Anda unduh).

Berikut adalah skrip shell yang melakukan hal di atas: https://gist.github.com/erdincay/4f1d2e092c50e78ae1ffa39d13fa404e

Erdinc Ay
sumber
4
Solusi pesta murni, yang paling sederhana. Sekadar informasi, kode bash ini dapat dijalankan di hampir semua lingkungan * nix, Linux, Cygwin, Mingw dan tentu saja Gitbash yang benar-benar merupakan emulasi terminal seperti yang lain.
m3nda
1
Ini tidak bekerja dengan organisasi, jadi tidak menjawab pertanyaan secara langsung. Jawaban dari Kenorb ini menangani organisasi dan bekerja hingga 1000 repo juga - bekerja lebih baik untuk saya.
RichVel
1
dengan otentifikasi: curl " api.github.com/$CNTX/$NAME/… " | grep -e 'git_url *' | cut -d \ "-f 4 | xargs -L1 git clone
Yannick Wurm
2
Harap perbarui jawaban (Feb-2019): menurut GitHub API v3 curl Anda harus menuju ke / orgs / ORGNAME / repos. Juga mungkin menyertakan link ke API v3: developer.github.com/v3 Juga untuk repos pribadi Anda perlu menambahkan curl -u "username", kemudian curl akan menanyakan password Anda sekali. Jika tidak, bekerja dengan baik!
:)
1
UPDATE dari komentar hevkoplyas dimitry stackoverflow.com/questions/19576742/… . developer.github.com/v3 mengembalikan status 301 saat mencoba curl. gunakan perintah bash ini curl -u "{username}" " api.github.com/orgs {org} / repos? page = 1 & per_page = 100" | grep -o 'git @ [^ "] *' | xargs -L1 git clone bekerja 100%
Tommy
44

Repositori organisasi

Untuk menggandakan semua repo dari organisasi Anda, coba shell one-liner berikut:

GHORG=company; curl "https://api.github.com/orgs/$GHORG/repos?per_page=1000" | grep -o 'git@[^"]*' | xargs -L1 git clone

Repositori pengguna

Menggandakan semua menggunakan URL repositori Git:

GHUSER=CHANGEME; curl "https://api.github.com/users/$GHUSER/repos?per_page=1000" | grep -o 'git@[^"]*' | xargs -L1 git clone

Mengkloning semua menggunakan Clone URL:

GHUSER=CHANGEME; curl "https://api.github.com/users/$GHUSER/repos?per_page=1000" | grep -w clone_url | grep -o '[^"]\+://.\+.git' | xargs -L1 git clone

Berikut adalah fungsi shell yang dapat ditambahkan ke file startup pengguna (menggunakan curl+ jq):

# Usage: gh-clone-user (user)
gh-clone-user() {
  curl -sL "https://api.github.com/users/$1/repos?per_page=1000" | jq -r '.[]|.clone_url' | xargs -L1 git clone
}

Repositori pribadi

Jika Anda perlu mengkloning repo pribadi, Anda dapat menambahkan token Otorisasi di header Anda seperti:

-H 'Authorization: token <token>'

atau berikan di param ( ?access_token=TOKEN), misalnya:

curl -s "https://api.github.com/users/$GHUSER/repos?access_token=$GITHUB_API_TOKEN&per_page=1000" | grep -w clone_url | grep -o '[^"]\+://.\+.git' | xargs -L1 git clone

Catatan:

  • Untuk hanya mengambil repositori pribadi, tambahkan type=privateke string kueri Anda.
  • Cara lain adalah menggunakan hubsetelah mengonfigurasi kunci API Anda.

Lihat juga:


Petunjuk :
- Untuk meningkatkan kecepatan, atur jumlah proses paralel dengan menentukan -Pparameter untuk xargs( -P4= 4 proses).
- Jika Anda perlu meningkatkan batas GitHub, coba autentikasi dengan menentukan kunci API Anda.
- Tambahkan --recursiveuntuk mengulang ke submodul terdaftar, dan perbarui setiap submodul bersarang di dalamnya.

kenorb
sumber
2
per_page = 1000 maxes pada 100
aehlke
20

Inti ini menyelesaikan tugas dalam satu baris pada baris perintah:

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"]} ]}'

Ganti [your_org]dengan nama organisasi Anda. Dan atur per_pagejika perlu.

MEMPERBARUI:

Seperti yang disebutkan ATutorMe, ukuran halaman maksimum adalah 100, menurut dokumen GitHub .

Jika Anda memiliki lebih dari 100 repo, Anda harus menambahkan pageparameter ke url Anda dan Anda dapat menjalankan perintah untuk setiap halaman.

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"]} ]}'

Catatan: per_pageParameter defaultnya adalah 30.

seancdavis
sumber
Tahu bagaimana hal ini dilakukan untuk repo pribadi yang Anda miliki aksesnya?
MichaelGofron
yang kedua tidak berfungsi karena ampersand membuatnya pergi ke tugas latar belakang
slashdottir
Saya menambahkan & access_token = <my_access_token> ke url dan itu bekerja dengan sempurna
rmartinus
Yang kedua: halaman = 1 (!)
Yannick Wurm
5

Buka Pengaturan Akun -> Aplikasi dan buat kunci API
Kemudian masukkan kunci API, url instance github, dan nama organisasi pada skrip di bawah ini

#!/bin/bash

# Substitute variables here
ORG_NAME="<ORG NAME>"
ACCESS_TOKEN="<API KEY>"
GITHUB_INSTANCE="<GITHUB INSTANCE>

URL="https://${GITHUB_INSTANCE}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}"

curl ${URL} | ruby -rjson -e 'JSON.load(STDIN.read).each {|repo| %x[git clone #{repo["ssh_url"]} ]}'

Simpan itu dalam sebuah file, chmod u+xfile tersebut, lalu jalankan.

Terima kasih kepada Arnaud untuk kode rubynya.

Cory Klein
sumber
5

Jadi, saya akan menambahkan jawaban saya juga. :) (Saya merasa itu sederhana)

Ambil daftar (saya telah menggunakan perusahaan "magento"):

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

Gunakan clone_urlsebagai gantinya ssh_urluntuk menggunakan akses HTTP.

Jadi, mari kita kloning semuanya! :)

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

Jika Anda akan mengambil repo pribadi - cukup tambahkan parameter GET ?access_token=YOURTOKEN

Kirby
sumber
4

Saya menemukan komentar di inti @seancdavis yang disediakan untuk sangat membantu, terutama karena seperti poster aslinya, saya ingin menyinkronkan semua repo untuk akses cepat, namun sebagian besar bersifat pribadi.

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

Ganti [[USERNAME]] dengan nama pengguna github Anda dan [[ORGANIZATION]] dengan organisasi Github Anda. Output (metadata repo JSON) akan diteruskan ke skrip ruby ​​sederhana:

# bring in the Ruby json library
require "json"

# read from STDIN, parse into ruby Hash and iterate over each repo
JSON.load(STDIN.read).each do |repo|
  # run a system command (re: "%x") of the style "git clone <ssh_url>"
  %x[git clone #{repo["ssh_url"]} ]
end
Garren S
sumber
1
Solusi ini bekerja dengan sempurna untuk saya. Sebenarnya yang saya butuhkan hanyalah mengkloning semua repo akun pribadi saya ke mesin lokal baru saya. Sangat berguna untuk menyiapkan workstation baru. Catatan: untuk melakukan ini saya harus pindah .../orgs/[[organization]]/repos...ke .../users/[[username]]/repos.... Sekarang saya dapat dengan cepat mengimpor semua pekerjaan saya ke mesin lokal yang berbeda. TERIMA KASIH!
B. Bulpett
2

Python one-liner ini akan melakukan apa yang Anda butuhkan. Itu:

  • periksa github untuk repositori Anda yang tersedia
  • untuk masing-masing, lakukan panggilan sistem ke git clone

    python -c "import json, urllib, os; [os.system('git clone ' + r['ssh_url']) for r in json.load(urllib.urlopen('https://api.github.com/orgs/<<ORG_NAME>>/repos?per_page=200'))]"
    
Evren Ozkan
sumber
2
curl -s https://api.github.com/orgs/[GITHUBORG_NAME]/repos | grep clone_url | awk -F '":' '{ print $2 }' | sed 's/\"//g' | sed 's/,//' | while read line; do git clone "$line"; done
julianzhang.dll
sumber
2
Harap tambahkan penjelasan untuk solusi Anda. Dengan begitu, orang lain yang memiliki masalah serupa akan dapat memahami solusi Anda dengan lebih mudah!
Nander Speerstra
Detailnya adalah membutuhkan nomor halaman seperti ?page=2.
Bruno Wego
2

Solusi sederhana:

NUM_REPOS=1000
DW_FOLDER="Github_${NUM_REPOS}_repos"
mkdir ${DW_FOLDER}
cd ${DW_FOLDER}
for REPO in $(curl https://api.github.com/users/${GITHUB_USER}/repos?per_page=${NUM_REPOS} | awk '/ssh_url/{print $2}' | sed 's/^"//g' | sed 's/",$//g') ; do git clone ${REPO} ; done
Antonio Feitosa
sumber
2

Saya mencoba beberapa perintah dan alat di atas, tetapi memutuskan bahwa itu terlalu merepotkan, jadi saya menulis alat baris perintah lain untuk melakukan ini, yang disebut github-dl.

Untuk menggunakannya (dengan asumsi Anda telah menginstal nodejs)

npx github-dl -d /tmp/test wires

Ini akan mendapatkan daftar semua repo dari wiresdan menulis info ke testdirektori, menggunakan detail otorisasi (pengguna / sandi) yang Anda berikan di CLI.

Secara detail, itu

  1. Meminta autentikasi (mendukung 2FA)
  2. Mendapatkan daftar repositori untuk pengguna / organisasi melalui Github API
  3. Apakah pagination untuk ini, jadi lebih dari 100 repo didukung

Ini tidak benar-benar mengkloning repo, tetapi menulis .txtfile yang dapat Anda berikan xargsuntuk melakukan kloning, misalnya:

cd /tmp/test
cat wires-repo-urls.txt | xargs -n2 git clone

# or to pull
cat /tmp/test/wires-repo-urls.txt | xargs -n2 git pull

Mungkin ini berguna untuk Anda; itu hanya beberapa baris JS jadi harus mudah menyesuaikan dengan kebutuhan Anda

kabel
sumber
1

Ada juga modul npm yang sangat berguna untuk melakukan ini. Itu tidak hanya dapat mengkloning, tetapi juga menarik (untuk memperbarui data yang sudah Anda miliki).

Anda cukup membuat konfigurasi seperti ini:

[{
   "username": "BoyCook",
   "dir": "/Users/boycook/code/boycook",
   "protocol": "ssh"
}]

dan lakukan gitall clonemisalnya. Ataugitall pull

Vladislav Rastrusny
sumber
1

Jika ada yang mencari solusi Windows, berikut adalah sedikit fungsi di PowerShell untuk melakukan triknya (bisa oneliner / alias jika bukan sebenarnya saya membutuhkannya untuk bekerja dengan dan tanpa proxy).

function Unj-GitCloneAllBy($User, $Proxy = $null) {
    (curl -Proxy $Proxy "https://api.github.com/users/$User/repos?page=1&per_page=100").Content 
      | ConvertFrom-Json 
      | %{ $_.clone_url } 
      # workaround git printing to stderr by @wekempf aka William Kempf
      # https://github.com/dahlbyk/posh-git/issues/109#issuecomment-21638678
      | %{ & git clone $_ 2>&1 } 
      | % { $_.ToString() }
}
Andrzej Lichnerowicz
sumber
1

Jadi, dalam praktiknya, jika Anda ingin mengkloning semua repo dari organisasi FOOyang cocok BAR, Anda dapat menggunakan one-liner di bawah ini, yang memerlukan utilitas jq dan cli umum.

curl 'https://api.github.com/orgs/FOO/repos?access_token=SECRET' |
  jq '.[] |
  .ssh_url' |
  awk '/BAR/ {print "git clone " $0 " & "}' |
  sh
konr
sumber
1

Skrip shell lain dengan komentar yang mengkloning semua repositori (publik dan pribadi) dari pengguna:

#!/bin/bash

USERNAME=INSERT_USERNAME_HERE
PASSWORD=INSERT_PASSWORD_HERE

# Generate auth header
AUTH=$(echo -n $USERNAME:$PASSWORD | base64)

# Get repository URLs
curl -iH "Authorization: Basic "$AUTH https://api.github.com/user/repos | grep -w clone_url > repos.txt

# Clean URLs (remove " and ,) and print only the second column
cat repos.txt | tr -d \"\, | awk '{print $2}'  > repos_clean.txt

# Insert username:password after protocol:// to generate clone URLs
cat repos_clean.txt |  sed "s/:\/\/git/:\/\/$USERNAME\:$PASSWORD\@git/g" > repos_clone.txt

while read FILE; do
    git clone $FILE
done <repos_clone.txt

rm repos.txt & rm repos_clone.txt
hlorand
sumber
1

Buat alias bash / func di file ~/.bashrc file

Saya menyelesaikan ini untuk tim saya dengan membuat alias / bash func di my ~/.bashrc file

Langkah

buka terminal atau shell linux dan buka ~/.bashrc file:

sudo nano ~/.bashrc

tambahkan fungsi ini:

CloneAll() {
    # Make the url to the input github organization's repository page.
    ORG_URL="https://api.github.com/orgs/${1}/repos?per_page=200";

    # List of all repositories of that organization (seperated by newline-eol).
    ALL_REPOS=$(curl -s ${ORG_URL} | grep html_url | awk 'NR%2 == 0' \
                | cut -d ':' -f 2-3 | tr -d '",');

    # Clone all the repositories.
    for ORG_REPO in ${ALL_REPOS}; do
        git clone ${ORG_REPO}.git;
    done
}

simpan dan tutup flile ~ / .bashrc Anda dan kemudian tutup terminal - Anda perlu melakukan ini atau func baru tidak akan menginisialisasi:

buka terminal baru dan coba:

CloneAll <your_github_org_name>

contoh : jika URL repo github pribadi Anda disebut https://github.com/awesome-async , perintahnya adalah

CloneAll awesome-async

Penting

yang per_page=200pada akhir variabel pertama ORG_URLmenetapkan jumlah repo yang akan dikloning, sehingga membayar perhatian khusus untuk itu:

ORG_URL="https://api.github.com/orgs/${1}/repos?per_page=200";  <---- make sure this is what you want

Semoga ini membantu! :)

Flavio
sumber
Sepertinya maks. nilai untuk per_page adalah 100 ... untuk organisasi besar menambahkan nomor halaman sebagai parameter ke-2 dan berfungsi sempurna untuk kebutuhan saya...repos?page=${2}&per_page=100";
sv3n
0

Anda bisa mendapatkan daftar repositori dengan menggunakan curldan kemudian mengulang daftar tersebut dengan loop bash:

GIT_REPOS=`curl -s curl https://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN} | grep ssh_url | awk -F': ' '{print $2}' | sed -e 's/",//g' | sed -e 's/"//g'`
for REPO in $GIT_REPOS; do
  git clone $REPO
done
Sriram Mageswaran
sumber
0

Untuk mengkloning repo privat saja, diberi kunci akses, dan diberikan python 3 dan modul request yang dipasang:

ORG=company; ACCESS_KEY=0000000000000000000000000000000000000000; for i in $(python -c "import requests; print(' '.join([x['ssh_url'] for x in list(filter(lambda x: x['private'] ,requests.get('https://api.github.com/orgs/$ORG/repos?per_page=1000&access_token=$ACCESS_KEY').json()))]))"); do git clone $i; done;
ubugnu
sumber
0

Solusi Python3 yang menyertakan penomoran halaman lengkap melalui LinkHeader.

Prasyarat:


import json
import requests
from requests.auth import HTTPBasicAuth
import links_from_header

respget = lambda url: requests.get(url, auth=HTTPBasicAuth('githubusername', 'githubtoken'))

myorgname = 'abc'
nexturl = f"https://api.github.com/orgs/{myorgname}/repos?per_page=100"

while nexturl:
    print(nexturl)
    resp = respget(nexturl)

    linkheads = resp.headers.get('Link', None)
    if linkheads:
        linkheads_parsed = links_from_header.extract(linkheads)
        nexturl = linkheads_parsed.get('next', None)
    else:
        nexturl = None

    respcon = json.loads(resp.content)
    with open('repolist', 'a') as fh:
        fh.writelines([f'{respconi["full_name"]}\n' for respconi in respcon])

Kemudian, Anda dapat menggunakan xargsatau paralel dan:cat repolist | parallel -I% hub clone %

Jose Alban
sumber
0

Jika Anda memiliki daftar repositori dalam daftar seperti ini, maka skrip shell ini berfungsi:

user="https://github.com/user/"

declare -a arr=("repo1", "repo2")

for i in "${arr[@]}"

do

   echo $user"$i"

   git clone $user"$i"

done 
Kasthuri Shravankumar
sumber
jika ada beberapa repositori pribadi, Anda dapat memperbarui "pengguna" dengan cara ini: user = " user: [email protected]/user "
Med Ali Difallah
0

Saya membuat contoh skrip batch. Anda dapat mengunduh semua repositori pribadi / publik dari github.com. Setelah repositori diunduh, secara otomatis diubah menjadi file zip.

@echo off
setlocal EnableDelayedExpansion
SET "username=olyanren"
SET "password=G....."
set "mypath=%cd%\"
SET "url=https://%username%:%password%@github.com/%username%/"
FOR /F "tokens=* delims=" %%i in (files.txt) do (
SET repo=%%i
rmdir /s /q !repo!
git clone "!url!!repo!.git"
cd !repo!
echo !mypath!
git archive --format=zip -o "!mypath!!repo!.zip" HEAD
cd ..
)

Catatan: file files.txt hanya boleh berisi nama repositori seperti:

repository1
repository2
olyanren
sumber
0

Pembaruan dari 19 Mei

gunakan perintah bash ini untuk organisasi (termasuk repo pribadi)

curl -u "{username}" "https://api.github.com/orgs/{org}/repos?page=1&per_page=100" | grep -o 'git@[^"]*' | xargs -L1 git clone
Tommy
sumber
0

Jawaban yang berlaku di sini tidak memperhitungkan bahwa Github API hanya akan mengembalikan maksimal 100 repositori terlepas dari apa yang Anda tentukan per_page. Jika Anda menggandakan organisasi Github dengan lebih dari 100 repositori, Anda harus mengikuti tautan halaman dalam respons API.

Saya menulis alat CLI untuk melakukan hal itu :

clone-github-org -o myorg

Ini akan mengkloning semua repositori dalam myorgorganisasi ke direktori kerja saat ini.

Chad
sumber
0

Untuk organisasi yang Anda miliki aksesnya dengan repositori pribadi:

curl -u <YOUR_GITHUB_USERNAME> -s https://api.github.com/orgs/<ORG_NAME>/repos?per_page=200 | ruby -rubygems -e ’require “json”; JSON.load(STDIN.read).each { |repo| %x[git clone #{repo[“html_url”]} ]}'

Ini menggunakan html_url, jadi Anda tidak perlu access_tokenhanya memasukkan kata sandi github Anda saat diminta.

Flavio
sumber
Autentikasi dasar yang menggunakan kata sandi ke API tidak digunakan lagi dan dalam waktu dekat tidak akan berfungsi lagi. Kunjungi [deprecating-password-auth] ( developer.github.com/changes/… ) untuk informasi lebih lanjut seputar solusi yang disarankan dan tanggal penghapusan.
BogeyMan
0

Gandakan semua repo Anda yang bukan merupakan garpu:

curl -u "username" https://api.github.com/user/repos\?page\=1\&per_page\=100 |
  jq -r 'map(select(.fork == false)) | .[] | .ssh_url' |
  xargs -L1 git clone

Kloning intisari Anda:

curl https://api.github.com/users/username/gists\?page\=1\&per_page\=100 |
   jq -r ".[] | .git_pull_url +\" '\" + (.files|keys|join(\"__\") + \"'\")" |
   xargs -L1 git clone

Ini jqperintah kompleks karena nama gists' repo ini adalah hash, sehingga perintah yang concatenates semua nama file menjadi nama repo ini


Anda dapat memfilter JSON secara sewenang-wenang menggunakan jq

Install: sudo apt-get install jq

Dalam contoh di atas, saya memfilter garpu menggunakan ini: curl ... | jq -r 'map(select(.fork == false))' ...- berguna untuk tidak mengkloning repo tempat Anda membuat permintaan tarik biasa

jq mendukung beberapa fitur yang sangat canggih. man jqadalah temanmu


Anda dapat mengautentikasi dengan curl -u "username" ... untuk mengakses repositori pribadi


URL API Guthub

  • Repos Anda (membutuhkan otentikasi): https://api.github.com/user/repos\?page\=1\&per_page\=100
  • Semua pengguna: https://api.github.com/users/other_username/repos\?page\=1\&per_page\=100
  • Org: https://api.github.com/orgs/orgname/repos\?page\=1\&per_page\=100

Dokumen Github API untuk repositori

Madacol
sumber
0
"""
Clone all public Github Repos

https://developer.github.com/v3/repos/#list-repositories-for-a-user
"""

import urllib.request, base64
import json
import os


def get_urls(username):
    url = f"https://api.github.com/users/{username}/repos?per_page=200"
    request = urllib.request.Request(url)
    result = urllib.request.urlopen(request)
    return json.load(result)


if __name__ == "__main__":
    for r in get_urls("MartinThoma"):
        if not os.path.isdir(r["name"]):
            print(f"Clone {r['name']}...")
            os.system("git clone " + r["ssh_url"])
        else:
            print(f"SKIP {r['name']}...")
Martin Thoma
sumber
0

Untuk mengkloning semua repo pribadi dan publik Anda sendiri, sederhana buat token akses baru dengan akses repo dan gunakan ini:

(ganti dengan token akses dan nama pengguna Anda sendiri)

for line in $(curl https://api.github.com/user/repos?access_token=ACCESS_TOKEN_HERE  | grep -o "[email protected]:YOUR_USER_NAME/[^ ,\"]\+");do git clone $line;done

Ini akan mengkloning semua repo di folder saat ini

Ini adalah program bash kecil, Anda cukup menempelkannya di terminal dan tekan enter

Basel Akasha
sumber