GitHub'dan tüm depoları aynı anda nasıl klonlayabilirim?


100

Bir şirket GitHub hesabım var ve otomasyon amacıyla oluşturulabilecek yeni herhangi bir şeyi hesaba katarak içindeki tüm depoları yedeklemek istiyorum. Bunun gibi bir şey umuyordum:

git clone git@github.com:company/*.git 

veya benzeri işe yarar, ancak oradaki joker karakterden hoşlanmıyor.

Git'te klonlamanın ve sonra uygun izinlere sahip olduğunu varsayarak her şeyi çekmenin bir yolu var mı?


2
İyi soru. Peki bunları çekme yoluyla senkronize etmeye ne dersiniz? Cevaplardan herhangi biri çekimler için işe yarıyor mu?
nealmcb

Düğüm veya yakut konusunda pek usta olmayanlar için bir python çözümüne ihtiyacımız var;) Veya github bunu okuyup bize
acımalı

Yanıtlar:


53

Bunu bu şekilde yapmanın mümkün olduğunu sanmıyorum. En iyi bahsiniz, API'yi kullanarak bir Kuruluşun depolarının bir listesini bulup gözden geçirmektir.

Bunu dene:

  • Hesap Ayarları -> Uygulamalar'a giderek bir API simgesi oluşturun
  • Şu numarayı arayın: http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
  • Yanıt bir JSON nesne dizisi olacaktır. Her nesne, o Organizasyon altındaki depolardan biri hakkında bilgi içerecektir. Sanırım senin durumunda, özellikle ssh_urlmülkü arıyor olacaksın .
  • Sonra git clonebunların her biri ssh_url.

Biraz fazladan iş, ancak GitHub'ın uygun kimlik doğrulamasına sahip olması gerekiyor.


API belirtecini oluşturdum ve aramadan çıktı alıyorum, ancak depolarımız veya 'ssh_url' dizesi hakkında bildiklerimi referans alan hiçbir şey görmüyorum. Aramayı düzgün yapmadığımdan şüpheleniyorum. curl -i https://github.com/api/v3/orgs/company/repos?access_token=<token>
numb3rs1x

Bu bir GitHub Enterprise hesabı mı yoksa github.com mu?
Thomas Kelley

1
Ah, seni yanlış anladım. Kurumsal hesap olduğunu sanıyordum. Bunun yerine https://github.com/api/v3/deneyin https://api.github.com/.
Thomas Kelley

1
Ve özel şirketinizin nasıl kurulduğundan emin değilim, ancak bir "kuruluş" yerine bir "kullanıcı" ise, o zaman /users/${COMPANY}/reposyerine yolu kullanmak isteyeceksiniz /orgs/${COMPANY}/repos.
Thomas Kelley

2
GitHub başına: access_tokenSorgu parametresini kullanmak artık önerilmediği için lütfen bunun yerine Yetkilendirme HTTP başlığını kullanın . Bu jeton, üzerinde kontrolünüz olmayan bir uygulama tarafından kullanılıyorsa, bu kullanımdan kaldırmanın bir sonucu olarak çalışmayabileceğini unutmayın.
BogeyMan

116

On Windows'un ve tüm UNIX / LINUX kullanan sistemler, Git Bash veya başka herhangi Terminali , yerine YOURUSERNAMEkullanıcı adı ve kullanımıyla:

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
  • Tüm depolarınızı indirmek için CNTX=usersve NAME=yourusername, ayarlayın .
  • Kuruluşunuzun tüm depolarını indirmek için CNTX=orgsve ayarlayın NAME=yourorgname.

Maksimum sayfa boyutu 100'dür, bu nedenle tüm depolarınızı almak için bunu doğru sayfa numarasıyla birkaç kez aramanız gerekir ( PAGEindirmek istediğiniz sayfa numarasına ayarlayın ).

İşte yukarıdakileri yapan bir kabuk komut dosyası: https://gist.github.com/erdincay/4f1d2e092c50e78ae1ffa39d13fa404e


4
Saf bash çözümü, en basit olanı. Bilginiz olsun, bu bash kodu hemen hemen her * nix ortamında, Linux, Cygwin, Mingw ve tabii ki Gitbash, diğerleri gibi gerçekten bir terminal öykünmesi olan çalıştırılabilir.
m3nda

1
Bu, kuruluşlarda işe yaramaz, bu nedenle soruyu doğrudan yanıtlamaz. Kenorb'un bu yanıtı , kuruluşları ele alıyor ve 1000 depoya kadar çalışıyor - benim için daha iyi oldu.
RichVel

1
kimlik doğrulaması ile: curl " api.github.com/$CNTX/$NAME/… " | grep -e 'git_url *' | kes -d \ "-f 4 | xargs -L1 git klonu
Yannick Wurm

2
Lütfen cevabı güncelleyin (Şubat-2019): GitHub API v3'e göre curl'niz / orgs / ORGNAME / repos'a gitmelidir. Ayrıca API v3: developer.github.com/v3 bağlantısını da içerebilir. Ayrıca özel depolar için curl -u "kullanıcı adı" eklemeniz gerekir, ardından curl size bir kez şifre soracaktır. Aksi takdirde harika çalışıyor!
:)

1
Dimitry hevkoplyas yorumundan GÜNCELLEME stackoverflow.com/questions/19576742/… . developer.github.com/v3 kıvrılmaya çalışıldığında 301 durumunu döndürür. bu bash komutunu kullanın curl -u "{kullanıcı adı}" " api.github.com/orgs {org} / repos? page = 1 & per_page = 100" | grep -o 'git @ [^ "] *' | xargs -L1 git klonu% 100 çalışıyor
Tommy

45

Organizasyon havuzları

Kuruluşunuzdaki tüm depoları klonlamak için aşağıdaki kabuk tek satırlık uygulamayı deneyin:

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

Kullanıcı veri havuzları

Tümünü Git depo URL'lerini kullanarak klonlamak:

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

Tümünü Klonlama URL'si kullanarak klonlama:

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

Kullanıcının başlangıç ​​dosyalarına ( curl+ kullanılarak jq) eklenebilecek kullanışlı kabuk işlevi :

# 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
}

Özel havuzlar

Özel depoları klonlamanız gerekiyorsa , başlığınıza aşağıdaki gibi Yetkilendirme jetonu ekleyebilirsiniz :

-H 'Authorization: token <token>'

veya param ( ?access_token=TOKEN) olarak iletin , örneğin:

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

Notlar:

  • Yalnızca özel depoları getirmek type=privateiçin sorgu dizenize ekleyin .
  • Başka bir yol, hubAPI anahtarınızı yapılandırdıktan sonra kullanmaktır .

Ayrıca bakınız:


İpuçları :
- Hızı artırmak -Piçin, xargs( -P4= 4 işlem) için parametre belirleyerek paralel işlemlerin sayısını ayarlayın .
- GitHub sınırlarını yükseltmeniz gerekiyorsa, API anahtarınızı belirterek kimlik doğrulamayı deneyin.
- --recursiveKayıtlı alt modülleri yinelemek için ekleyin ve içindeki iç içe geçmiş alt modülleri güncelleyin.


2
per_page = 100'de 1000 maksimum çıkış
aehlke

20

Bu özet , görevi komut satırında tek bir satırda gerçekleştirir:

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

[your_org]Kuruluşunuzun adıyla değiştirin . Ve per_pagegerekirse ayarlayın .

GÜNCELLEME:

ATutorMe'nin bahsettiği gibi, GitHub belgelerine göre maksimum sayfa boyutu 100'dür .

100'den fazla deponuz varsa, url'nize bir pageparametre eklemeniz gerekir ve her sayfa için komutu çalıştırabilirsiniz.

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

Not: Varsayılan per_pageparametre 30.


Erişiminizin olduğu özel depolar için bunun nasıl yapıldığı hakkında bir fikriniz var mı?
MichaelGofron

ikincisi çalışmıyor çünkü ve işareti arka planda bir göreve gitmesini sağlıyor
slashdottir

Url'ye & access_token = <my_access_token> ekledim ve mükemmel çalıştı
rmartinus

2: sayfa = 1 (!)
Yannick Wurm

5

Hesap Ayarları -> Uygulama'ya gidin ve bir API anahtarı oluşturun
Ardından API anahtarını, github örnek url'sini ve kuruluş adını aşağıdaki komut dosyasına ekleyin

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

Bunu bir dosyaya kaydedin chmod u+x, ardından çalıştırın.

Yakut kodu için Arnaud'a teşekkürler .


5

Bu yüzden cevabımı da ekleyeceğim. :) (Basit buldum)

Listesi getir ("magento" şirketini kullandım):

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

Kullanım clone_urlyerine ssh_urlkullanılması HTTP erişimi.

Öyleyse hepsini klonlayalım! :)

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

Özel depoları getirecekseniz - GET parametresini eklemeniz yeterli ?access_token=YOURTOKEN


4

@Seancdavis'in özetinde çok yardımcı olan bir yorum buldum , özellikle orijinal poster gibi hızlı erişim için tüm depoları senkronize etmek istedim, ancak çoğu özeldi.

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

[[KULLANICI ADI]] 'nı github kullanıcı adınızla ve [[ORGANİZASYON]]' u Github kuruluşunuzla değiştirin. Çıktı (JSON repo meta verileri) basit bir ruby ​​betiğine aktarılacaktır:

# 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

1
Bu çözüm benim için mükemmel çalıştı. Aslında ihtiyacım olan tek şey, tüm kişisel hesap depolarımı yeni yerel makineme klonlamaktı. Yeni iş istasyonu kurmak için çok kullanışlıdır. Not: Bunu yapmak için değiştirmem .../orgs/[[organization]]/repos...gerekiyordu .../users/[[username]]/repos.... Artık tüm çalışmalarımı farklı yerel makinelere hızlı bir şekilde aktarabiliyorum. TEŞEKKÜRLER!
B. Bulpett


2

Bu tek satırlık piton, ihtiyacınız olanı yapacak. O:

  • mevcut depolarınız için github'ı kontrol eder
  • her biri için bir sistem çağrısı yapar 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'))]"
    

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

2
Lütfen çözümünüze bir açıklama ekleyin. Böylelikle benzer sorunları olan diğer insanlar çözümünüzü daha kolay anlayabilir!
Nander Speerstra

Bir detay, ihtiyaç duyulan sayfa numarası gibi ?page=2.
Bruno Wego

2

Basit çözüm:

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

2

Yukarıdaki komutlardan ve araçlardan birkaçını denedim, ancak çok güç olduklarına karar verdim, bu yüzden bunu yapmak için adında başka bir komut satırı aracı yazdım github-dl.

Kullanmak için (nodej'lerin kurulu olduğunu varsayarak)

npx github-dl -d /tmp/test wires

Bu, CLI'de sağladığınız yetkilendirme ayrıntılarını (kullanıcı / geçiş) kullanarak tüm depoların bir listesini alır wiresve testdizine bilgi yazar .

Ayrıntılı olarak

  1. Kimlik doğrulama ister (2FA'yı destekler)
  2. Github API aracılığıyla kullanıcı / kuruluş için depoların listesini alır
  3. Bunun için sayfalandırma yapıyor, yani 100'den fazla repo destekleniyor

Aslında depoları klonlamaz, bunun yerine klonlamayı yapmak için .txtgeçebileceğiniz bir dosya yazın xargs, örneğin:

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

Belki bu sizin için yararlıdır; sadece birkaç satır JS olduğundan, ihtiyaçlarınıza göre ayarlanması kolay olmalıdır


1

Bunu yapmak için çok kullanışlı bir npm modülü de var. Yalnızca klonlamakla kalmaz, aynı zamanda çekebilir (zaten sahip olduğunuz verileri güncellemek için).

Sadece şu şekilde yapılandırma oluşturursunuz:

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

ve gitall cloneörneğin yapın. Veyagitall pull


1

Herhangi birinin bir Windows çözümü araması durumunda, burada PowerShell'de hile yapmak için küçük bir işlev var (hem proxy ile hem de proxy olmadan çalışması için ihtiyacım olmasa da oneliner / takma ad olabilir).

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() }
}

1

Bu nedenle, pratikte, organizasyondaki FOOeşleşen tüm depoları klonlamak istiyorsanız BAR, jq ve ortak cli yardımcı programları gerektiren aşağıdaki tek satırlık programı kullanabilirsiniz.

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

1

Bir kullanıcıdan tüm depoları (genel ve özel) klonlayan yorumlara sahip başka bir kabuk betiği:

#!/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

1

Bir bash takma adı / func oluşturun. ~/.bashrc file

Bunu ekibim için bir takma ad / bash işlevi oluşturarak çözdüm. ~/.bashrc file

adımlar

bir terminal veya linux kabuğu açın ve aşağıdakileri açın ~/.bashrc file:

sudo nano ~/.bashrc

bu işlevi ekleyin:

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
}

~ / .bashrc dosyanızı kaydedin ve kapatın ve ardından terminali kapatın - bunu yapmanız gerekir, yoksa yeni işlev başlatılmaz:

yeni terminal açın ve deneyin:

CloneAll <your_github_org_name>

örnek : kişisel github repo URL'niz https://github.com/awesome-async olarak adlandırılırsa , komut şu şekilde olacaktır:

CloneAll awesome-async

Önemli

per_page=200İlk değişkenin sonunda ORG_URLböylece özellikle dikkat klonlanmış olacak reponun sayısını belirler:

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

Bu yardımcı olur umarım! :)


Max görünüyor. sayfa başına değer 100 ... büyük kuruluşlar için 2. parametre olarak sayfa numarası eklendi ve ihtiyaçlarım için mükemmel çalışıyor...repos?page=${2}&per_page=100";
sv3n

0

Kullanarak depoların bir listesini elde edebilir curlve ardından söz konusu listeyi bir bash döngüsü ile yineleyebilirsiniz:

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


0

Yalnızca özel depoları klonlamak için, bir erişim anahtarı verilir ve python 3 ve istek modülü yüklenir:

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;

0

LinkHeader aracılığıyla kapsamlı sayfalandırma içeren bir Python3 çözümü .

Ön koşullar:


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])

Ardından, xargsveya paralel kullanabilirsiniz ve:cat repolist | parallel -I% hub clone %



0

Örnek bir toplu komut dosyası oluşturdum. Tüm özel / genel depoları github.com'dan indirebilirsiniz. Bir arşiv indirildikten sonra, otomatik olarak bir zip dosyasına dönüştürülür.

@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 ..
)

Not: files.txt dosyası yalnızca aşağıdakiler gibi depo adlarını içermelidir:

repository1
repository2

0

19 Mayıs'tan itibaren güncelleme

bir kuruluş için bu bash komutunu kullanın (özel depo dahil)

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

0

Buradaki geçerli cevaplar, Github API'nin, içinde belirtebileceklerinize rağmen yalnızca maksimum 100 depo döndüreceğini hesaba katmaz per_page. 100'den fazla depoya sahip bir Github kuruluşunu klonlıyorsanız, API yanıtındaki sayfalama bağlantılarını izlemeniz gerekecektir.

Bunu yapmak için bir CLI aracı yazdım :

clone-github-org -o myorg

Bu, myorgorganizasyondaki tüm depoları mevcut çalışma dizinine klonlayacaktır .


0

Özel depolarla erişebileceğiniz kuruluşlar için:

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

Kullanır html_url, bu nedenle access_tokenistendiğinde github şifrenizi girmeniz gerekmez .


1
API için bir şifre kullanan temel kimlik doğrulaması kullanımdan kaldırıldı ve yakında artık çalışmayacak. Önerilen geçici çözümler ve kaldırma tarihleriyle ilgili daha fazla bilgi için [kullanımdan kaldırılan-şifre-kimlik doğrulaması] ( geliştirici.github.com/ changes/… ) adresini ziyaret edin .
BogeyMan

0

Çatal olmayan tüm depolarınızı klonlayın:

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

Özlerinizi klonlayın:

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

Bu jqkomut karmaşıktır çünkü özlerin deponun adı karmadır, böylece komut tüm dosya adlarını deponun adı olacak şekilde birleştirir.


JSON'u rastgele kullanarak filtreleyebilirsiniz: jq

Yüklemek: sudo apt-get install jq

Yukarıdaki örnekte, şunu kullanarak çatalları filtreledim : curl ... | jq -r 'map(select(.fork == false))' ...- sıradan çekme talepleri yaptığınız depoları klonlamamak için kullanışlıdır

jq , bazı çok gelişmiş özellikleri destekler. man jqsenin arkadaşın


Özel depolara erişmek için kimlik doğrulaması yapabilirsinizcurl -u "username" ...


Guthub'ın API URL'leri

  • Depolarınız (kimlik doğrulaması gerekiyor): https://api.github.com/user/repos\?page\=1\&per_page\=100
  • Herhangi bir kullanıcı: https://api.github.com/users/other_username/repos\?page\=1\&per_page\=100
  • Kuruluşlar: https://api.github.com/orgs/orgname/repos\?page\=1\&per_page\=100

Depolar için Github API Belgeleri


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

0

Tüm kendi özel ve genel depolarınızı klonlamak için, depo erişimiyle yeni bir erişim belirteci oluşturun ve bunu kullanın:

(kendi erişim jetonunuz ve kullanıcı adınızla değiştirin)

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

Bu, mevcut klasördeki tüm depoları klonlayacak

Bu küçük bir bash programı, sadece terminale yapıştırıp enter tuşuna basabilirsiniz.


0

Herkese açık ve özel kişisel depoları, kuruluş depolarını ve özleri tek bir basit araçla klonlamanıza / çekmenize olanak tanıyan GitHub Arşivi gibi bir araç kullanabilirsiniz .

Otomasyona gelince, GitHub Arşivini örneğin günde bir veya haftada bir çalışacak şekilde kurabilirsiniz ve klonlananları atlayacak ve diğerlerinin son çalıştırılmasından bu yana yeni değişiklikleri alacaktır.

Kaynak: https://github.com/Justintime50/github-archive

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.