GitHub से एक ही बार में सभी रिपोज को क्लोन कैसे करें?


97

मेरे पास एक कंपनी GitHub खाता है और मैं चाहता हूं कि सभी रिपॉजिटरी के भीतर, कुछ भी नया करने के लिए लेखांकन करना चाहिए जो स्वचालन के प्रयोजनों के लिए बनाया जा सकता है। मैं कुछ इस तरह की उम्मीद कर रहा था:

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

या इसी तरह काम करेगा, लेकिन यह वहाँ वाइल्डकार्ड पसंद नहीं है।

वहाँ एक तरीका है Git में क्लोन और फिर सब कुछ खींच एक उचित अनुमति है?


2
अच्छा प्रश्न। और पुल के माध्यम से उन्हें सिंक में रखने के बारे में कैसे? क्या कोई उत्तर पुल के लिए काम करता है?
nealmcb

हम एक अजगर समाधान की जरूरत है, हम में से उन लोगों के लिए नोड या रूबी में निपुण नहीं है;) या github यह पढ़ना चाहिए और हम पर दया
आती

कोशिश करें: github.com/wballard/git-friends
kenorb

जवाबों:


52

मुझे नहीं लगता कि ऐसा करना संभव है। एपीआई का उपयोग करके संगठन के रिपॉजिटरी की सूची के माध्यम से खोजने और लूप करने के लिए आपका सबसे अच्छा दांव है।

इसे इस्तेमाल करे:

  • खाता सेटिंग्स -> एप्लिकेशन पर जाकर एक एपीआई टोकन बनाएं
  • इसके लिए कॉल करें: http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
  • प्रतिक्रिया वस्तुओं का एक JSON सरणी होगी। प्रत्येक ऑब्जेक्ट में उस संगठन के तहत एक रिपॉजिटरी के बारे में जानकारी शामिल होगी। मुझे लगता है कि आपके मामले में, आप ssh_urlसंपत्ति के लिए विशेष रूप से देख रहे होंगे ।
  • फिर git cloneउनमें से प्रत्येक ssh_urlएस।

यह थोड़ा अतिरिक्त काम है, लेकिन GitHub के लिए उचित प्रमाणीकरण होना आवश्यक है।


मैंने API टोकन बनाया और मुझे कॉल से आउटपुट मिल रहा है, लेकिन मुझे कुछ भी संदर्भित नहीं दिखाई देता है जो मुझे हमारे रिपॉजिटरी या 'ssh_url' स्ट्रिंग के बारे में पता है। मुझे शक है कि मैंने ठीक से कॉल नहीं किया। curl -i https://github.com/api/v3/orgs/company/repos?access_token=<token>
numb3rs1x

क्या यह GitHub Enterprise खाता है, या github.com?
थॉमस केली

1
आह, मैंने तुम्हें गलत समझा। मुझे लगा कि यह एन एंटरप्राइज अकाउंट है। इसके बजाय https://github.com/api/v3/, प्रयास करें https://api.github.com/
थॉमस केली

1
और मुझे यकीन नहीं है कि आपकी विशेष कंपनी कैसे स्थापित की जाती है, लेकिन अगर यह "संगठन" के बजाय "उपयोगकर्ता" है, तो आप /users/${COMPANY}/reposइसके बजाय पथ का उपयोग करना चाहेंगे /orgs/${COMPANY}/repos
थॉमस केली

1
प्रति GitHub: कृपया access_tokenक्वेरी पैरामीटर का उपयोग करने के बजाय, प्राधिकरण HTTP हेडर का उपयोग करें । यदि इस टोकन का उपयोग किसी ऐसे ऐप द्वारा किया जा रहा है, जिसका आपके पास नियंत्रण नहीं है, तो ध्यान रखें कि यह इस पदावनति के परिणामस्वरूप काम करना बंद कर सकता है।
बोगीमैन

114

पर विंडोज और सभी यूनिक्स / लिनक्स प्रणाली, का उपयोग कर Git बैश या किसी अन्य टर्मिनल , की जगह YOURUSERNAMEअपने यूज़रनेम और उपयोग के द्वारा:

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
  • सेट करें CNTX=usersऔर NAME=yourusername, अपने सभी रिपॉजिटरी डाउनलोड करने के लिए।
  • सेट करें CNTX=orgsऔर NAME=yourorgname, अपने संगठन के सभी रिपॉजिटरी डाउनलोड करने के लिए।

अधिकतम पृष्ठ-आकार 100 है, इसलिए आपको अपनी सभी रिपॉजिटरी प्राप्त करने के लिए सही पेज नंबर के साथ कई बार कॉल करना होगा ( PAGEइच्छित पेज नंबर पर सेट करें जिसे आप डाउनलोड करना चाहते हैं)।

यहां एक शेल स्क्रिप्ट दी गई है जो ऊपर दी गई है: https://gist.github.com/erdincay/4f1d2e092c50e78ae1ffa39d13fa404e


4
शुद्ध बैश समाधान, सबसे सरल। आपकी जानकारी के लिए, इस बैश कोड को लगभग किसी भी * nix enviroment, Linux, Cygwin, Mingw में निष्पादित किया जा सकता है और बेशक Gitbash wich वास्तव में दूसरों की तरह एक टर्मिनल एमुलेशन है।
m3nda

1
यह संगठनों के साथ काम नहीं करता है, इसलिए यह सीधे सवाल का जवाब नहीं देता है। केनबर्ब का यह जवाब ओर्गास को संभालता है और 1000 रिपोज के लिए काम करता है - मेरे लिए बेहतर काम किया है।
रिचवेल

1
प्रमाणीकरण के साथ: कर्ल " api.github.com/$CNTX/$NAME/… " | grep -e 'git_url *' | cut -d \ "-f 4 | xargs -L1 git क्लोन
यानिक वुर्म

2
कृपया जवाब (फरवरी 2019) अपडेट करें: GitHub API v3 के अनुसार आपका कर्ल / orgs / ORGNAME / repos पर जाना चाहिए। इसके अलावा शायद एपीआई v3 के लिए एक लिंक शामिल करें: developer.github.com/v3 इसके अलावा निजी रिपोज के लिए आपको कर्ल-यू "उपयोगकर्ता नाम" जोड़ना होगा, फिर कर्ल आपसे एक बार पासवर्ड पूछेगा। अन्यथा महान काम कर रहे हैं!
:)

1
UPDATE डिमिट्री से hevkoplyas टिप्पणी stackoverflow.com/questions/19576742/… । डेवलपर.github.com/v3 कर्ल करने की कोशिश करते समय 301 स्थिति देता है। इस bash कमांड का उपयोग करें curl -u "{username}" " api.github.com/orgs {org} / repos? पेज = 1 और per_page = 100" | grep -o 'git @ [^ "] *' | xargs -L1 git क्लोन 100% काम करता है
टॉमी

43

संगठन रिपोजिटरी

अपने संगठन से सभी रिपोज को क्लोन करने के लिए, निम्नलिखित शेल वन-लाइनर का प्रयास करें:

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

उपयोगकर्ता रिपॉजिटरी

Git रिपॉजिटरी URL का उपयोग करके सभी क्लोनिंग:

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

यहां उपयोगी शेल फ़ंक्शन है जिसे उपयोगकर्ता की स्टार्टअप फ़ाइलों ( 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
}

निजी रिपोजिटरी

यदि आपको निजी प्रतिनिधि को क्लोन करने की आवश्यकता है, तो आप अपने शीर्षलेख में प्राधिकरण टोकन जोड़ सकते हैं जैसे:

-H 'Authorization: token <token>'

या इसे परम में पारित करें ( ?access_token=TOKEN), उदाहरण के लिए:

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

टिप्पणियाँ:

  • केवल निजी रिपॉजिटरी लाने के लिए, type=privateअपने क्वेरी स्ट्रिंग में जोड़ें ।
  • दूसरा तरीका hubअपनी एपीआई कुंजी को कॉन्फ़िगर करने के बाद उपयोग करना है ।

यह सभी देखें:


संकेत :
- गति बढ़ाने के -Pलिए, xargs( -P4= 4 प्रक्रियाओं) के लिए पैरामीटर निर्दिष्ट करके समानांतर प्रक्रियाओं की संख्या निर्धारित करें ।
- यदि आपको GitHub सीमा बढ़ाने की आवश्यकता है, तो अपनी API कुंजी निर्दिष्ट करके प्रमाणित करें।
- --recursiveपंजीकृत सबमॉड्यूल्स में पुनरावृत्ति करने के लिए जोड़ें , और किसी भी नेस्टेड सबमॉड्यूल को अपडेट करें।


2
per_page = 1000 अधिकतम 100
aehlke

20

यह कार्य कमांड लाइन पर एक लाइन में कार्य को पूरा करता है:

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]अपने संगठन का नाम बदलें । और per_pageयदि आवश्यक हो तो अपना सेट करें ।

अपडेट करें:

जैसा कि एटटमोर ने उल्लेख किया है, गिटहब डॉक्स के अनुसार अधिकतम पृष्ठ का आकार 100 है ।

यदि आपके पास 100 से अधिक रेपो हैं, तो आपको pageअपने यूआरएल में एक पैरामीटर जोड़ना होगा और आप प्रत्येक पेज के लिए कमांड चला सकते हैं।

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

ध्यान दें: डिफ़ॉल्ट per_pageपैरामीटर है 30


किसी भी विचार यह कि आप के लिए उपयोग किया है कि निजी प्रतिनिधि के लिए कैसे किया जाता है?
माइकलग्राफ्रॉन

दूसरा काम नहीं करता है क्योंकि एम्परसैंड बैकग्राउंड टास्क में जाता है
स्लैशडॉटिर

मैंने url में & access_token = <my_access_token> जोड़ा और इसे पूरी तरह से काम किया
rmartinus

दूसरा एक: पेज = 1 (!)
यानिक वुर्म

5

खाता सेटिंग्स पर जाएं -> एप्लिकेशन बनाएं और एक एपीआई कुंजी बनाएं
फिर नीचे दी गई स्क्रिप्ट में एपीआई कुंजी, जीथब्यू उदाहरण यूआरएल और संगठन का नाम डालें

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

एक फ़ाइल, फ़ाइल में सहेजें chmod u+x, फिर उसे चलाएं।

माणिक कोड के लिए अरनॉड को धन्यवाद ।


5

तो, मैं अपना जवाब भी जोड़ दूंगा। :) (मैंने पाया कि यह सरल है)

फ़ेच लिस्ट (मैंने "magento" कंपनी का उपयोग किया है):

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

HTTP एक्सेस का उपयोग करने के clone_urlबजाय उपयोग करें ssh_url

तो, चलो उन सभी क्लोन! :)

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

यदि आप निजी रेपो - लाने के लिए जा रहे हैं तो बस GET पैरामीटर जोड़ें ?access_token=YOURTOKEN


1
हां, कोई रूबी की जरूरत नहीं है, बस grepping ...
जिओ-फेंग ली

4

मैंने पाया में एक टिप्पणी सार विशेष रूप से, क्योंकि मूल पोस्टर की तरह, मैं त्वरित पहुँच के लिए सभी रेपोस, हालांकि जो के विशाल बहुमत के निजी थे सिंक करने के लिए चाहता था, बहुत उपयोगी हो करने के लिए प्रदान @seancdavis।

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

अपने गिथब उपयोगकर्ता नाम के साथ अपने गिथब उपयोगकर्ता नाम और [[संगठन]] के साथ [[USERNAME]] बदलें। आउटपुट (JSON रेपो मेटाडेटा) को एक साधारण रूबी स्क्रिप्ट में पास किया जाएगा:

# 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
इस समाधान ने मेरे लिए पूरी तरह से काम किया। वास्तव में मुझे जो कुछ भी चाहिए था वह था कि मैं अपने व्यक्तिगत खाते के सभी रिपॉजिट को अपने नए स्थानीय मशीन पर क्लोन करूं। नया कार्य केंद्र स्थापित करने के लिए बहुत आसान है। नोट: इस मुझे क्या करना परिवर्तन करना पड़ा .../orgs/[[organization]]/repos...करने के लिए .../users/[[username]]/repos...। अब मैं जल्दी से अपने सभी काम अलग-अलग स्थानीय मशीनों में आयात कर सकता हूं। धन्यवाद!
बी। बुलपेट


2

यह अजगर एक-लाइनर वही करेगा जो आपको चाहिए। यह:

  • आपके उपलब्ध रिपॉजिट के लिए जीथब चेक करता है
  • प्रत्येक के लिए, एक सिस्टम कॉल करता है 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
कृपया अपने समाधान में एक स्पष्टीकरण जोड़ें। इस तरह से समान मुद्दों वाले अन्य लोग आपके समाधान को अधिक आसानी से समझ पाएंगे!
नंदेर स्पैस्त्र शास्त्र

एक विवरण की आवश्यकता होती है जैसे पास पृष्ठ संख्या ?page=2
ब्रूनो वीगो

2

सरल समाधान:

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

मैंने ऊपर दिए गए कुछ कमांड और टूल की कोशिश की, लेकिन तय किया कि वे बहुत अधिक परेशानी में हैं, इसलिए मैंने ऐसा करने के लिए एक और कमांड-लाइन टूल लिखा, जिसे कॉल किया गया github-dl

इसका उपयोग करने के लिए (यह मानते हुए कि आपके पास नोडज स्थापित है)

npx github-dl -d /tmp/test wires

यह CLO पर आपके द्वारा प्रदान किए गए प्राधिकरण विवरण (उपयोगकर्ता / पास) का उपयोग करके सभी रेपो की सूची प्राप्त करेगा wiresऔर testनिर्देशिका में जानकारी लिखेगा ।

विस्तार से, यह

  1. ऑर्ट के लिए पूछता है (2FA का समर्थन करता है)
  2. Github API के माध्यम से उपयोगकर्ता / org के लिए रिपॉज की सूची प्राप्त करता है
  3. इसके लिए पेजिंग करता है, इसलिए 100 से अधिक रेपो का समर्थन करता है

यह वास्तव में रेपो का क्लोन नहीं करता है, बल्कि एक .txtफाइल लिखता है जिसे आप xargsक्लोनिंग करने के लिए पास कर सकते हैं , उदाहरण के लिए:

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

हो सकता है कि यह आपके लिए उपयोगी हो; यह जेएस की कुछ पंक्तियाँ हैं, इसलिए अपनी आवश्यकताओं को समायोजित करना आसान होना चाहिए


1

ऐसा करने के लिए एक बहुत ही उपयोगी एनपीएम मॉड्यूल भी है । यह न केवल क्लोन कर सकता है, बल्कि आपके पास पहले से मौजूद डेटा को अपडेट करने के लिए भी खींच सकता है।

आप बस इस तरह से कॉन्फिग बनाते हैं:

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

और gitall cloneउदाहरण के लिए करते हैं। याgitall pull


1

यदि कोई Windows समाधान के लिए देखता है, तो ट्रिक करने के लिए यहां PowerShell में एक छोटा सा कार्य है (हो सकता है कि oneliner / alias हो सकता है यदि इस तथ्य की आवश्यकता नहीं है कि मुझे प्रॉक्सी के साथ और बिना काम करने की आवश्यकता है)।

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

तो, व्यवहार में, यदि आप संगठन से सभी रिपॉस को क्लोन करना चाहते हैं FOOजो मैच करते हैं BAR, तो आप नीचे दिए गए वन-लाइनर का उपयोग कर सकते हैं, जिसके लिए jq और सामान्य क्लि उपयोगिताओं की आवश्यकता होती है

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

1

टिप्पणियों के साथ एक और शेल स्क्रिप्ट जो उपयोगकर्ता से सभी रिपॉजिटरी (सार्वजनिक और निजी) क्लोन करता है:

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

अपने में एक बैश उपनाम / दुर्गंध बनाएँ ~/.bashrc file

मैंने अपनी टीम में एक उपनाम / बैश फंक बनाकर इसे हल किया ~/.bashrc file

कदम

एक टर्मिनल या लाइन खोल खोलो और अपने को खोलें ~/.bashrc file:

sudo nano ~/.bashrc

इस फ़ंक्शन को जोड़ें:

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
}

सहेजें और अपने ~ /।

नया टर्मिनल खोलें और इसे आज़माएँ:

CloneAll <your_github_org_name>

उदाहरण : यदि आपके व्यक्तिगत github repo URL को https://github.com/awesome-async कहा जाता है तो कमांड होगा

CloneAll awesome-async

जरूरी

per_page=200पहले चर के अंत में ORG_URLरेपोस कि क्लोन किया जाएगा की संख्या सेट करता है, ताकि पर विशेष ध्यान देना:

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

उम्मीद है की यह मदद करेगा! :)


अधिकतम लगता है। per_page के लिए मान 100 है ... बड़े orgs के लिए 2 नंबर पैरामीटर के रूप में पेज नंबर जोड़ा गया है और यह मेरी जरूरतों के लिए पूरी तरह से काम करता है...repos?page=${2}&per_page=100";
sv3n

0

आप उपयोग कर रिपॉजिटरी की एक सूची प्राप्त कर सकते हैं curlऔर फिर बैश लूप के साथ उक्त सूची पर पुनरावृति कर सकते हैं:

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

आप github रिपॉजिटरी के गुच्छा क्लोन करने के लिए ओपन-सोर्स टूल का उपयोग कर सकते हैं: https://github.com/artiomn/git_cloner

उदाहरण:

git_cloner --type github --owner octocat --login user --password user https://my_bitbucket

से JSON API का उपयोग करें api.github.com। आप github प्रलेखन में कोड उदाहरण देख सकते हैं: https://developer.github.com/v3/

या वहाँ:

https://github.com/artiomn/git_cloner/blob/master/src/git_cloner/github.py


0

केवल निजी प्रतिनिधि को क्लोन करने के लिए, एक एक्सेस कुंजी दी गई है, और अजगर 3 और अनुरोध मॉड्यूल स्थापित किया गया है:

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

एक पायथन 3 समाधान जिसमें Linkहैडर के माध्यम से संपूर्ण पृष्ठांकन शामिल है ।

पूर्व आवश्यक वस्तुएँ:


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

फिर, आप का उपयोग कर सकते हैं xargsया समानांतर और:cat repolist | parallel -I% hub clone %


0

यदि आपके पास इस तरह की सूची में रिपॉजिटरी की सूची है, तो यह शेल स्क्रिप्ट काम करता है:

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

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

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

do

   echo $user"$i"

   git clone $user"$i"

done 

"उपयोगकर्ता =: अगर वहाँ कुछ निजी खजाने है, तो आप" उपयोगकर्ता "इस तरह से अद्यतन कर सकते हैं : password@github.com/user उपयोगकर्ता "
मेड अली Difallah

0

मैंने एक नमूना बैच स्क्रिप्ट बनाई। आप github.com से सभी निजी / सार्वजनिक रिपॉजिटरी डाउनलोड कर सकते हैं। एक रिपॉजिटरी डाउनलोड होने के बाद, यह स्वचालित रूप से ज़िप फ़ाइल में बदल जाती है।

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

नोट: files.txt फ़ाइल में केवल रिपॉजिटरी नाम होना चाहिए जैसे:

repository1
repository2

0

19 मई से अपडेट

किसी संगठन के लिए इस बैश कमांड का उपयोग करें (निजी रेपो शामिल)

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

0

यहाँ प्रचलित उत्तर इस बात को ध्यान में नहीं रखते हैं कि जीथब एपीआई केवल 100 रिपॉजिटरी की अधिकतम राशि लौटाएगा जो आप निर्दिष्ट कर सकते हैं per_page। यदि आप 100 से अधिक रिपॉजिटरी के साथ जीथब ऑर्ग की क्लोनिंग कर रहे हैं, तो आपको एपीआई प्रतिक्रिया में पेजिंग लिंक का पालन करना होगा।

मैंने ऐसा करने के लिए एक CLI उपकरण लिखा है :

clone-github-org -o myorg

यह myorgसंगठन के सभी रिपोजिटरी को वर्तमान कार्य निर्देशिका में क्लोन कर देगा।


0

Orgs के लिए आप निजी प्रतिनिधि के साथ उपयोग कर सकते हैं:

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

यह उपयोग करता है html_url, इसलिए access_tokenजब आपको संकेत दिया जाए तो आपको बस अपने github पासवर्ड को दर्ज करने की आवश्यकता नहीं है ।


एपीआई के लिए एक पासवर्ड का उपयोग करने वाला मूल प्रमाणीकरण पदावनत है और अब जल्द ही काम नहीं करेगा। सुझाई गई वर्कअराउंड और हटाने की तारीखों के बारे में अधिक जानकारी के लिए [deprecating-password-dif] ( developer.github.com/changes/… ) पर जाएं।
बोगीमैन

@BogeyMan अपडेट के लिए धन्यवाद!
फ्लाविओ

0

अपने सभी रिपोज को क्लोन करें जो कांटे नहीं हैं:

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

अपने लिंग को क्लोन करें:

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

यह jqकमांड जटिल है क्योंकि जिस्टो के रेपो का नाम हैश है, इसलिए यह कमांड रेपो का नाम होने के लिए सभी फाइलनामों को मिलाता है


आप JSON का उपयोग करके मनमाने ढंग से फ़िल्टर कर सकते हैं jq

इंस्टॉल: sudo apt-get install jq

ऊपर दिए गए उदाहरण में, मैंने इसका उपयोग करते हुए कांटे बाहर निकाल दिए : curl ... | jq -r 'map(select(.fork == false))' ...- रेपो क्लोनिंग के लिए उपयोगी है जहां आपने आकस्मिक पुल अनुरोध बनाए हैं

jq कुछ बहुत ही उन्नत सुविधाओं का समर्थन करता है। man jqआपका दोस्त है


आप निजी रेपो तक पहुँचने के लिए प्रमाणित कर सकते हैंcurl -u "username" ...


गुथुब का एपीआई पेशाब करता है

  • आपके भंडार (प्रमाणीकरण की आवश्यकता है): https://api.github.com/user/repos\?page\=1\&per_page\=100
  • कोई भी उपयोगकर्ता: https://api.github.com/users/other_username/repos\?page\=1\&per_page\=100
  • Orgs: https://api.github.com/orgs/orgname/repos\?page\=1\&per_page\=100

Github API डॉक्स रिपॉज के लिए


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

क्लोन करने के लिए अपने सभी निजी और सार्वजनिक रिपॉजिट सरल को रिपोज एक्सेस के साथ एक नया एक्सेस टोकन उत्पन्न करते हैं और इसका उपयोग करते हैं:

(अपनी पहुंच टोकन और उपयोगकर्ता नाम के साथ बदलें)

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

यह करंट फोल्डर में सभी रिपोज को क्लोन करेगा

यह थोड़ा बैश प्रोग्राम है, आप इसे टर्मिनल और हिट एंट्री में पेस्ट कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.