จะโคลน repos ทั้งหมดพร้อมกันจาก GitHub ได้อย่างไร?


103

ฉันมีบัญชี GitHub ของ บริษัท และฉันต้องการสำรองที่เก็บข้อมูลทั้งหมดภายในบัญชีสำหรับสิ่งใหม่ ๆ ที่อาจสร้างขึ้นเพื่อวัตถุประสงค์ในการทำงานอัตโนมัติ ฉันหวังว่าจะมีอะไรแบบนี้:

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

หรือคล้ายกันก็ใช้ได้ แต่ดูเหมือนว่าจะไม่ชอบสัญลักษณ์แทนที่นั่น

มีวิธีใน Git ในการโคลนแล้วดึงทุกอย่างโดยสมมติว่ามีสิทธิ์ที่เหมาะสมหรือไม่?


2
คำถามที่ดี. แล้วจะทำให้ซิงค์ผ่าน pull ได้อย่างไร? คำตอบใดใช้ได้ผลกับ pulls หรือไม่?
nealmcb

เราต้องการโซลูชัน python สำหรับพวกเราที่ไม่เชี่ยวชาญเรื่อง node หรือ ruby;) หรือ github ควรอ่านสิ่งนี้และสงสารเราและเพียงแค่ให้อินเทอร์เฟซเว็บที่เรียบง่ายสำหรับสิ่งนี้ ....
nealmcb

คำตอบ:


53

ฉันไม่คิดว่ามันจะทำได้ขนาดนั้น ทางออกที่ดีที่สุดของคุณคือการค้นหาและวนซ้ำรายการที่เก็บขององค์กรโดยใช้ API

ลองสิ่งนี้:

  • สร้างโทเค็น API โดยไปที่การตั้งค่าบัญชี -> แอปพลิเคชัน
  • โทรไปที่: http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
  • การตอบสนองจะเป็นอาร์เรย์ JSON ของวัตถุ แต่ละออบเจ็กต์จะรวมข้อมูลเกี่ยวกับหนึ่งในที่เก็บภายใต้องค์กรนั้น ฉันคิดว่าในกรณีของคุณคุณจะมองหาssh_urlอสังหาริมทรัพย์โดยเฉพาะ
  • จากนั้นgit cloneแต่ละssh_urls.

เป็นงานพิเศษเล็กน้อย แต่ GitHub จำเป็นต้องมีการตรวจสอบสิทธิ์ที่เหมาะสม


ฉันสร้างโทเค็น API และได้รับผลลัพธ์จากการโทร แต่ฉันไม่เห็นสิ่งใดที่อ้างถึงสิ่งที่ฉันรู้เกี่ยวกับที่เก็บของเราหรือสตริง "ssh_url" ฉันสงสัยว่าฉันโทรไม่ถูกต้อง curl -i https://github.com/api/v3/orgs/company/repos?access_token=<token>
num3rs1x

นี่คือบัญชี GitHub Enterprise หรือ github.com
Thomas Kelley

1
อาฉันเข้าใจคุณผิด ฉันคิดว่ามันเป็นบัญชี Enterprise แทนที่จะพยายามhttps://github.com/api/v3/ https://api.github.com/
Thomas Kelley

1
และผมไม่แน่ใจว่าวิธีการที่ บริษัท ของคุณโดยเฉพาะการตั้งค่า แต่ถ้ามันเป็น "ผู้ใช้" แทนที่จะเป็น "องค์กร" แล้วคุณจะต้องการที่จะใช้เส้นทางแทน/users/${COMPANY}/repos /orgs/${COMPANY}/repos
Thomas Kelley

2
ต่อ GitHub: โปรดใช้ส่วนหัว Authorization HTTP แทนเนื่องจากการใช้access_tokenพารามิเตอร์การค้นหาถูกเลิกใช้ หากแอปที่คุณไม่สามารถควบคุมโทเค็นนี้ใช้โทเค็นโปรดทราบว่าอาจหยุดทำงานอันเป็นผลมาจากการเลิกใช้งานนี้
BogeyMan

116

บนWindowsและระบบ UNIX / LINUXทั้งหมดโดยใช้Git BashหรือTerminal อื่น ๆให้แทนที่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
Pure bash solution ที่ง่ายที่สุด สำหรับข้อมูลของคุณรหัสทุบตีนี้สามารถดำเนินการได้ในเกือบทุกสภาพแวดล้อม * nix, Linux, Cygwin, Mingw และแน่นอนว่า Gitbash ซึ่งเป็นโปรแกรมจำลองเทอร์มินัลเหมือนกับที่อื่น ๆ
m3nda

1
วิธีนี้ใช้ไม่ได้กับองค์กรดังนั้นจึงไม่ตอบคำถามโดยตรง คำตอบจาก Kenorb นี้จัดการองค์กรและทำงานได้ถึง 1,000 repos เช่นกัน - ทำงานได้ดีกว่าสำหรับฉัน
RichVel

1
พร้อมการรับรองความถูกต้อง: curl " api.github.com/$CNTX/$NAME/… " | grep -e 'git_url *' | cut -d \ "-f 4 | xargs -L1 git clone
Yannick Wurm

2
โปรดอัปเดตคำตอบ (กุมภาพันธ์ 2019): ตาม GitHub API v3 curl ของคุณควรไปที่ / orgs / ORGNAME / repos นอกจากนี้อาจมีลิงก์ไปยัง API v3: developer.github.com/v3 ด้วยสำหรับ repos ส่วนตัวคุณจะต้องเพิ่ม curl -u "username" จากนั้น curl จะถามรหัสผ่านหนึ่งครั้ง มิฉะนั้นจะทำงานได้ดี!
:)

1
อัปเดตจากความคิดเห็นของ dimitry hevkoplyas stackoverflow.com/questions/19576742/… . developer.github.com/v3 ส่งคืนสถานะ 301 เมื่อพยายามขด ใช้คำสั่ง bash curl -u "{username}" " api.github.com/orgs {org} / repos? page = 1 & per_page = 100" | grep -o 'git @ [^ "] *' | xargs -L1 git clone ทำงานได้ 100%
Tommy

46

ที่เก็บขององค์กร

หากต้องการโคลน repos ทั้งหมดจากองค์กรของคุณให้ลองใช้เชลล์หนึ่งซับต่อไปนี้:

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

ที่เก็บผู้ใช้

การโคลนทั้งหมดโดยใช้ URL ที่เก็บ Git:

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

การโคลนทั้งหมดโดยใช้ 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
}

ที่เก็บส่วนตัว

หากคุณต้องการโคลน repos ส่วนตัวคุณสามารถเพิ่มAuthorization tokenในส่วนหัวของคุณเช่น:

-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หลังจากกำหนดค่าคีย์ API ของคุณ

ดูสิ่งนี้ด้วย:


คำแนะนำ :
- หากต้องการเพิ่มความเร็วให้กำหนดจำนวนของกระบวนการแบบขนานโดยระบุ-Pพารามิเตอร์สำหรับxargs( -P4= 4 กระบวนการ)
- หากคุณต้องการเพิ่มขีด จำกัด GitHub ให้ลองตรวจสอบสิทธิ์โดยระบุคีย์ API ของคุณ
- เพิ่ม--recursiveเพื่อเรียกคืนในโมดูลย่อยที่ลงทะเบียนและอัปเดตโมดูลย่อยที่ซ้อนกันภายใน


3
per_page = 1000 maxes ออกที่ 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หากจำเป็น

อัพเดท:

ในฐานะที่เป็น ATutorMe กล่าวขนาดหน้าสูงสุดคือ 100 ตามเอกสาร GitHub

หากคุณมีมากกว่า 100 repos คุณจะต้องเพิ่มpageพารามิเตอร์ใน url ของคุณและคุณสามารถเรียกใช้คำสั่งสำหรับแต่ละเพจได้

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_page30


มีความคิดอย่างไรกับ repos ส่วนตัวที่คุณสามารถเข้าถึงได้?
MichaelGofron

อันที่สองไม่ทำงานทำให้เครื่องหมายและทำให้มันไปที่งานเบื้องหลัง
slashdottir

ฉันเพิ่ม & access_token = <my_access_token> ลงใน url และทำงานได้อย่างสมบูรณ์
rmartinus

อันที่ 2: page = 1 (!)
Yannick Wurm

5

ไปที่การตั้งค่าบัญชี -> แอปพลิเคชันและสร้างคีย์ API
จากนั้นใส่คีย์ API, URL อินสแตนซ์ github และชื่อองค์กรในสคริปต์ด้านล่าง

#!/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ไฟล์จากนั้นเรียกใช้

ขอบคุณArnaudสำหรับรหัสทับทิม


5

ดังนั้นฉันจะเพิ่มคำตอบของฉันด้วย :) (ฉันพบว่ามันง่าย)

รายการดึงข้อมูล (ฉันเคยใช้ บริษัท "magento"):

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

ใช้clone_urlแทนssh_urlเพื่อใช้การเข้าถึง HTTP

ดังนั้นเรามาโคลนทั้งหมดกันเถอะ! :)

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

หากคุณกำลังจะดึงข้อมูล repo ส่วนตัว - เพียงแค่เพิ่มพารามิเตอร์ GET ?access_token=YOURTOKEN


4

ฉันพบความคิดเห็นในส่วนสำคัญ @seancdavis ที่ให้ไว้เพื่อเป็นประโยชน์มากโดยเฉพาะอย่างยิ่งเนื่องจากเช่นเดียวกับโปสเตอร์ต้นฉบับฉันต้องการซิงค์ repos ทั้งหมดเพื่อให้เข้าถึงได้อย่างรวดเร็ว แต่ส่วนใหญ่เป็นแบบส่วนตัว

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]] ด้วยชื่อผู้ใช้ github และ [[ORGANIZATION]] ด้วยองค์กร Github ของคุณ เอาต์พุต (ข้อมูลเมตาของรีโป JSON) จะถูกส่งต่อไปยังสคริปต์ Ruby แบบธรรมดา

# 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
วิธีนี้ใช้ได้ผลดีสำหรับฉัน จริงๆแล้วสิ่งที่ฉันต้องการคือโคลน repos บัญชีส่วนตัวทั้งหมดไปยังเครื่องใหม่ของฉัน มีประโยชน์มากสำหรับการตั้งค่าเวิร์กสเตชันใหม่ หมายเหตุ: ในการทำสิ่งนี้ฉันต้องเปลี่ยน.../orgs/[[organization]]/repos...เป็น.../users/[[username]]/repos.... ตอนนี้ฉันสามารถนำเข้างานทั้งหมดของฉันไปยังเครื่องอื่น ๆ ได้อย่างรวดเร็ว ขอบคุณ!
B. Bulpett

3

Python one-liner นี้จะทำในสิ่งที่คุณต้องการ มัน:

  • ตรวจสอบ github สำหรับ repos ที่มีอยู่ของคุณ
  • สำหรับแต่ละคนทำการเรียกระบบไปที่ 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
โปรดเพิ่มคำอธิบายในโซลูชันของคุณ ด้วยวิธีนี้คนอื่น ๆ ที่มีปัญหาคล้ายกันจะสามารถเข้าใจโซลูชันของคุณได้ง่ายขึ้น!
Nander Speerstra

รายละเอียดคือต้องผ่านหมายเลขหน้าเช่น?page=2.
Bruno Wego

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.

เพื่อใช้งาน (สมมติว่าคุณติดตั้ง nodejs ไว้)

npx github-dl -d /tmp/test wires

สิ่งนี้จะได้รับรายชื่อ repo ทั้งหมดจากwiresและเขียนข้อมูลลงในไฟล์testไดเร็กทอรีโดยใช้รายละเอียดการอนุญาต (ผู้ใช้ / pass) ที่คุณระบุใน CLI

ในรายละเอียดนั้น

  1. ขอรับรองความถูกต้อง (รองรับ 2FA)
  2. รับรายการ repos สำหรับผู้ใช้ / องค์กรผ่าน Github API
  3. มีการแบ่งหน้าสำหรับสิ่งนี้จึงรองรับ repo มากกว่า 100 รายการ

มันไม่ได้โคลน repos จริง ๆ แต่เขียน.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

บางทีนี่อาจเป็นประโยชน์สำหรับคุณ JS เป็นเพียงไม่กี่บรรทัดดังนั้นควรปรับให้เข้ากับความต้องการของคุณได้ง่าย


1

นอกจากนี้ยังมีโมดูล npm ที่มีประโยชน์มากในการทำเช่นนี้ ไม่เพียง แต่สามารถโคลน แต่ดึงได้เช่นกัน (เพื่ออัปเดตข้อมูลที่คุณมีอยู่แล้ว)

คุณเพิ่งสร้าง config ดังนี้:

[{
   "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

ดังนั้นในทางปฏิบัติหากคุณต้องการโคลน repos ทั้งหมดจากองค์กรFOOที่ตรงกันBARคุณสามารถใช้ one-liner ด้านล่างซึ่งต้องใช้jqและยูทิลิตี้ cli ทั่วไป

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

สร้าง bash alias / func ในไฟล์ ~/.bashrc file

ฉันแก้ไขสิ่งนี้ให้กับทีมของฉันโดยสร้างนามแฝง / bash func ในไฟล์ ~/.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
}

บันทึกและปิด ~ / .bashrc flile ของคุณจากนั้นปิดเทอร์มินัล - คุณต้องทำสิ่งนี้หรือ func ใหม่จะไม่เริ่มต้น:

เปิดเทอร์มินัลใหม่และทดลองใช้:

CloneAll <your_github_org_name>

ตัวอย่าง : หาก URL repo github ส่วนตัวของคุณเรียกว่าhttps://github.com/awesome-asyncคำสั่งจะเป็น

CloneAll awesome-async

สำคัญ

per_page=200ในตอนท้ายของตัวแปรแรกORG_URLกำหนดจำนวนของ Repos ที่จะโคลนเพื่อให้ความใส่ใจเป็นพิเศษกับที่:

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

หวังว่านี่จะช่วยได้! :)


ดูเหมือนว่าสูงสุด ค่า per_page คือ 100 ... สำหรับองค์กรขนาดใหญ่ที่เพิ่มหมายเลขหน้าเป็นพารามิเตอร์ที่ 2 และทำงานได้อย่างสมบูรณ์แบบสำหรับความต้องการของฉัน...repos?page=${2}&per_page=100";
sv3n

0

คุณสามารถรับรายการที่เก็บได้โดยใช้curlแล้ววนซ้ำรายการดังกล่าวด้วย bash loop:

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

ในการโคลนเฉพาะ repos ส่วนตัวให้รับคีย์การเข้าถึงและติดตั้ง python 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

โซลูชัน Python3 ที่มีการแบ่งหน้าอย่างละเอียดถี่ถ้วนผ่านทางLinkHeader

ข้อกำหนดเบื้องต้น:


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 

หากมีที่เก็บส่วนตัวคุณสามารถอัปเดต "ผู้ใช้" ด้วยวิธีนี้: user = " user: password@github.com/user "
Med Ali Difallah

0

ฉันสร้างสคริปต์ชุดตัวอย่าง คุณสามารถดาวน์โหลดที่เก็บส่วนตัว / สาธารณะทั้งหมดได้จาก github.com หลังจากดาวน์โหลดที่เก็บแล้วระบบจะแปลงเป็นไฟล์ 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 ..
)

หมายเหตุ: ไฟล์files.txtควรมีเฉพาะชื่อที่เก็บเช่น:

repository1
repository2

0

อัปเดตตั้งแต่วันที่ 19 พฤษภาคม

ใช้คำสั่ง bash นี้สำหรับองค์กร (รวม repo ส่วนตัว)

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

0

คำตอบที่มีอยู่ในที่นี้ไม่ได้คำนึงถึงว่า Github API จะส่งคืนที่เก็บสูงสุด 100 แห่งเท่านั้นแม้ว่าคุณจะระบุper_pageอะไรก็ตาม หากคุณกำลังโคลนองค์กร Github ที่มีที่เก็บมากกว่า 100 แห่งคุณจะต้องติดตามลิงก์เพจในการตอบกลับของ API

ฉันเขียนเครื่องมือ CLI เพื่อทำสิ่งนั้น :

clone-github-org -o myorg

สิ่งนี้จะโคลนที่เก็บทั้งหมดในmyorgองค์กรไปยังไดเร็กทอรีการทำงานปัจจุบัน


0

สำหรับองค์กรที่คุณสามารถเข้าถึงได้ด้วย repos ส่วนตัว:

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 ของคุณเมื่อได้รับแจ้ง


1
การรับรองความถูกต้องพื้นฐานโดยใช้รหัสผ่านไปยัง API นั้นเลิกใช้งานแล้วและจะใช้งานไม่ได้อีกต่อไป ไปที่ [deprecating-password-auth] ( developer.github.com/changes/… ) เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีแก้ปัญหาที่แนะนำและวันที่ลบ
BogeyMan

0

โคลน repos ทั้งหมดของคุณที่ไม่ใช่ส้อม:

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คำสั่งที่มีความซับซ้อนเนื่องจากชื่อ repo จิสต์เป็น hashes ดังนั้นคำสั่งที่เชื่อมทุกไฟล์จะเป็นชื่อ repo ของ


คุณสามารถกรอง JSON โดยพลการโดยใช้ jq

ติดตั้ง: sudo apt-get install jq

ในตัวอย่างด้านบนฉันกรองส้อมออกโดยใช้สิ่งนี้: curl ... | jq -r 'map(select(.fork == false))' ...- มีประโยชน์สำหรับการไม่โคลน repos ที่คุณส่งคำขอดึงแบบไม่เป็นทางการ

jqรองรับคุณสมบัติขั้นสูงบางอย่าง man jqเป็นเพื่อนของคุณ


คุณสามารถรับรองความถูกต้องcurl -u "username" ... เพื่อเข้าถึง repos ส่วนตัว


URL API ของ Guthub

  • repos ของคุณ (ต้องการการตรวจสอบสิทธิ์): https://api.github.com/user/repos\?page\=1\&per_page\=100
  • ผู้ใช้ใด ๆ : https://api.github.com/users/other_username/repos\?page\=1\&per_page\=100
  • องค์กร: https://api.github.com/orgs/orgname/repos\?page\=1\&per_page\=100

Github API เอกสารสำหรับ repos


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

ในการโคลน repos ส่วนตัวและสาธารณะทั้งหมดของคุณเองให้สร้างโทเค็นการเข้าถึงใหม่ด้วยการเข้าถึง repos และใช้สิ่งนี้:

(แทนที่ด้วยโทเค็นการเข้าถึงและชื่อผู้ใช้ของคุณเอง)

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

สิ่งนี้จะโคลน repos ทั้งหมดในโฟลเดอร์ปัจจุบัน

นี่เป็นโปรแกรมทุบตีเล็ก ๆ น้อย ๆ คุณสามารถวางลงในเทอร์มินัลแล้วกด Enter


0

คุณสามารถใช้เครื่องมือเช่นGitHub Archiveซึ่งช่วยให้คุณสามารถโคลน / ดึง repos ส่วนบุคคลสาธารณะและส่วนตัว repos ขององค์กรและส่วนสำคัญทั้งหมดด้วยเครื่องมือง่ายๆเพียงอย่างเดียว

สำหรับระบบอัตโนมัติคุณสามารถตั้งค่า GitHub Archive ให้ทำงานวันละครั้งหรือสัปดาห์ละครั้งและจะข้ามสิ่งที่โคลนและดึงการเปลี่ยนแปลงใหม่ตั้งแต่ครั้งสุดท้ายที่มีการเรียกใช้งานอื่น ๆ ทั้งหมด

ที่มา: https://github.com/Justintime50/github-archive

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.