Làm cách nào để sao chép tất cả các đại diện cùng một lúc từ GitHub?


97

Tôi có tài khoản GitHub của công ty và tôi muốn sao lưu tất cả các kho lưu trữ bên trong, tính đến bất kỳ thứ gì mới có thể được tạo cho mục đích tự động hóa. Tôi đã hy vọng một cái gì đó như thế này:

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

hoặc tương tự sẽ hoạt động, nhưng có vẻ như nó không thích ký tự đại diện ở đó.

Có cách nào trong Git để sao chép và sau đó kéo mọi thứ giả sử một người có quyền thích hợp không?


2
Câu hỏi hay. Và làm thế nào về việc giữ chúng đồng bộ hóa, thông qua kéo? Có câu trả lời nào phù hợp với việc kéo không?
nealmcb

Chúng tôi cần một giải pháp python, đối với những người trong chúng tôi không quá thành thạo về nút hoặc ruby;) Hoặc github nên đọc điều này và lấy làm tiếc cho chúng tôi và chỉ cung cấp một giao diện web đơn giản cho việc này ....
nealmcb

Câu trả lời:


52

Tôi không nghĩ có thể làm theo cách đó. Đặt cược tốt nhất của bạn là tìm và lặp qua danh sách các kho của Tổ chức bằng cách sử dụng API.

Thử cái này:

  • Tạo mã thông báo API bằng cách đi tới Cài đặt tài khoản -> Ứng dụng
  • Gọi điện đến: http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
  • Phản hồi sẽ là một mảng JSON của các đối tượng. Mỗi đối tượng sẽ bao gồm thông tin về một trong các kho thuộc Tổ chức đó. Tôi nghĩ trong trường hợp của bạn, bạn sẽ tìm kiếm cụ thể cho ssh_urltài sản.
  • Sau đó, git clonemỗi ssh_urls.

Đó là một chút công việc bổ sung, nhưng GitHub cần thiết phải có xác thực thích hợp.


Tôi đã tạo mã thông báo API và tôi nhận được đầu ra từ cuộc gọi, nhưng tôi không thấy bất kỳ điều gì tham chiếu đến những gì tôi biết về kho lưu trữ của chúng tôi hoặc chuỗi 'ssh_url'. Tôi nghi ngờ tôi đã không thực hiện cuộc gọi đúng cách. curl -i https://github.com/api/v3/orgs/company/repos?access_token=<token>
tê3rs1x

Đây là tài khoản GitHub Enterprise hay github.com?
Thomas Kelley,

1
Ah, tôi hiểu lầm bạn. Tôi nghĩ đó là tài khoản Doanh nghiệp. Thay vì https://github.com/api/v3/, hãy thử https://api.github.com/.
Thomas Kelley,

1
Và tôi không chắc công ty cụ thể của bạn được thiết lập như thế nào, nhưng nếu đó là "người dùng" thay vì "tổ chức", thì bạn sẽ muốn sử dụng /users/${COMPANY}/reposđường dẫn thay vì /orgs/${COMPANY}/repos.
Thomas Kelley

1
Per GitHub: Vui lòng sử dụng tiêu đề HTTP Cấp quyền thay vì sử dụng access_tokentham số truy vấn không được dùng nữa. Nếu mã thông báo này đang được sử dụng bởi một ứng dụng mà bạn không có quyền kiểm soát, hãy lưu ý rằng nó có thể ngừng hoạt động do việc ngừng sử dụng này.
BogeyMan

114

Trên Windows và tất cả các hệ thống UNIX / LINUX , sử dụng Git Bash hoặc bất kỳ Terminal nào khác , hãy thay thế YOURUSERNAMEbằng tên người dùng của bạn và sử dụng:

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 CNTX=usersNAME=yourusernametải xuống tất cả các kho của bạn.
  • Đặt CNTX=orgsNAME=yourorgnametải xuống tất cả các kho lưu trữ của tổ chức bạn.

Kích thước trang tối đa là 100, vì vậy bạn phải gọi điều này nhiều lần với số trang phù hợp để nhận được tất cả kho lưu trữ của bạn (được đặt thành PAGEsố trang mong muốn mà bạn muốn tải xuống).

Đây là một tập lệnh shell thực hiện điều trên: https://gist.github.com/erdincay/4f1d2e092c50e78ae1ffa39d13fa404e


4
Giải pháp bash tinh khiết, đơn giản nhất. Đối với thông tin của bạn, mã bash này có thể được thực thi trong hầu hết mọi môi trường * nix, Linux, Cygwin, Mingw và tất nhiên Gitbash wich thực sự là một mô phỏng thiết bị đầu cuối giống như các môi trường khác.
m3nda

1
Điều này không hoạt động với các tổ chức, vì vậy nó không trực tiếp trả lời câu hỏi. Câu trả lời này từ Kenorb thực sự xử lý các tổ chức và hoạt động với tối đa 1000 repo - hoạt động tốt hơn đối với tôi.
RichVel

1
với xác thực: curl " api.github.com/$CNTX/$NAME/… " | grep -e 'git_url *' | cut -d \ "-f 4 | xargs -L1 git clone
Yannick Wurm

2
Vui lòng cập nhật câu trả lời (tháng 2 năm 2019): theo GitHub API v3, phần trình bày của bạn sẽ chuyển đến / orgs / ORGNAME / repos. Ngoài ra, có thể bao gồm một liên kết đến API v3: developer.github.com/v3 Ngoài ra, đối với các repos riêng tư, bạn cần thêm "tên người dùng" curl -u, sau đó curl sẽ hỏi bạn mật khẩu một lần. Nếu không làm việc tuyệt vời! :)))
Dmitry Shevkoplyas

1
CẬP NHẬT từ nhận xét hevkoplyas dimitry stackoverflow.com/questions/19576742/… . developer.github.com/v3 trả về trạng thái 301 khi cố gắng cuộn tròn. sử dụng lệnh bash này curl -u "{username}" " api.github.com/orgs {org} / repos? page = 1 & per_page = 100" | grep -o 'git @ [^ "] *' | xargs -L1 git clone hoạt động 100%
Tommy

43

Kho tổ chức

Để sao chép tất cả các đại diện từ tổ chức của bạn, hãy thử trình bao một lớp lót sau:

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

Kho người dùng

Sao chép tất cả bằng cách sử dụng URL của kho lưu trữ Git:

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

Sao chép tất cả bằng cách sử dụng URL nhân bản:

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

Đây là hàm shell hữu ích có thể được thêm vào các tệp khởi động của người dùng (sử dụng 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
}

Kho lưu trữ riêng

Nếu bạn cần sao chép các repo riêng tư, bạn có thể thêm Mã thông báo ủy quyền vào tiêu đề của mình như:

-H 'Authorization: token <token>'

hoặc chuyển nó vào param ( ?access_token=TOKEN), ví dụ:

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

Ghi chú:

  • Để chỉ tìm nạp các kho lưu trữ riêng tư, hãy thêm type=private vào chuỗi truy vấn của bạn.
  • Một cách khác là sử dụng hubsau khi định cấu hình khóa API của bạn.

Xem thêm:


Gợi ý :
- Để tăng tốc độ, hãy đặt số quá trình song song bằng cách chỉ định -Ptham số cho xargs( -P4= 4 quá trình).
- Nếu bạn cần tăng giới hạn GitHub, hãy thử xác thực bằng cách chỉ định khóa API của bạn.
- Thêm --recursiveđể đệ quy vào các mô-đun con đã đăng ký và cập nhật bất kỳ mô-đun con lồng nhau nào bên trong.


2
per_page = 1000 tối đa đạt 100
aehlke

20

Ý chính này hoàn thành nhiệm vụ trong một dòng trên dòng lệnh:

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

Thay thế [your_org]bằng tên tổ chức của bạn. Và thiết lậpper_page nếu cần thiết.

CẬP NHẬT:

Như ATutorMe đã đề cập, kích thước trang tối đa là 100, theo tài liệu GitHub .

Nếu bạn có hơn 100 đại diện, bạn sẽ phải thêm một pagetham số vào url của mình và bạn có thể chạy lệnh cho mỗi trang.

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

Lưu ý: per_pageTham số mặc định là 30.


Bất kỳ ý tưởng nào về cách điều này được thực hiện cho các kho lưu trữ riêng tư mà bạn có quyền truy cập?
MichaelGofron

thứ hai thì không làm việc gây ra dấu và làm cho nó đi đến một tác vụ chạy nền
slashdottir

Tôi thêm & access_token = <my_access_token> để url và nó làm việc một cách hoàn hảo
rmartinus

Địa chỉ thứ 2: page = 1 (!)
Yannick Wurm

5

Đi tới Cài đặt tài khoản -> Ứng dụng và tạo khóa API
Sau đó chèn khóa API, url phiên bản github và tên tổ chức trong tập lệnh bên dưới

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

Lưu nó trong một tệp, chmod u+xtệp, sau đó chạy nó.

Cảm ơn Arnaud về mã ruby.


5

Vì vậy, tôi cũng sẽ thêm câu trả lời của mình. :) (Tôi thấy nó đơn giản)

Danh sách tìm nạp (tôi đã sử dụng công ty "magento"):

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

Sử dụng clone_urlthay thếssh_url để sử dụng truy cập HTTP.

Vì vậy, hãy nhân bản tất cả chúng! :)

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

Nếu bạn định tìm nạp repo riêng tư - chỉ cần thêm tham số GET ?access_token=YOURTOKEN


1
Có, không cần ruby, chỉ cần nạp ...
Xiao-Feng Li

4

Tôi thấy nhận xét trong gist @seancdavis được cung cấp là rất hữu ích, đặc biệt là vì giống như người đăng ban đầu, tôi muốn đồng bộ hóa tất cả các repo để truy cập nhanh, tuy nhiên phần lớn trong số đó là riêng tư.

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

Thay [[USERNAME]] bằng tên người dùng github của bạn và [[ORGANIZATION]] bằng tổ chức Github của bạn. Đầu ra (siêu dữ liệu repo JSON) sẽ được chuyển đến một tập lệnh ruby ​​đơn giản:

# 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
Giải pháp này đã làm việc hoàn hảo cho tôi. Trên thực tế, tất cả những gì tôi cần là sao chép tất cả các kho lưu trữ tài khoản cá nhân của mình sang máy cục bộ mới của tôi. Rất tiện dụng để thiết lập máy trạm mới. Lưu ý: để làm điều này, tôi phải thay đổi .../orgs/[[organization]]/repos...thành .../users/[[username]]/repos.... Bây giờ tôi có thể nhanh chóng nhập tất cả công việc của mình vào các máy cục bộ khác nhau. CẢM ƠN!
B. Bulpett


2

Con trăn một lớp lót này sẽ làm những gì bạn cần. Nó:

  • kiểm tra github cho các kho lưu trữ có sẵn của bạn
  • cho mỗi, thực hiện một cuộc gọi hệ thống tới 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
Vui lòng thêm giải thích cho giải pháp của bạn. Bằng cách đó, những người khác có vấn đề tương tự sẽ có thể hiểu giải pháp của bạn dễ dàng hơn!
Nander Speerstra

Một chi tiết là cần vượt qua số trang như thế nào ?page=2.
Bruno Wego

2

Giải pháp đơn giản:

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

Tôi đã thử một số lệnh và công cụ ở trên, nhưng quyết định rằng chúng quá phức tạp, vì vậy tôi đã viết một công cụ dòng lệnh khác để thực hiện việc này, được gọi là github-dl.

Để sử dụng nó (giả sử bạn đã cài đặt nodejs)

npx github-dl -d /tmp/test wires

Thao tác này sẽ nhận được danh sách tất cả các đại diện từ wiresvà ghi thông tin vào testthư mục, sử dụng chi tiết ủy quyền (user / pass) mà bạn cung cấp trên CLI.

Về chi tiết, nó

  1. Yêu cầu xác thực (hỗ trợ 2FA)
  2. Nhận danh sách các đại diện cho người dùng / tổ chức thông qua Github API
  3. Có phân trang cho điều này, vì vậy hơn 100 đại diện được hỗ trợ

Nó không thực sự sao chép các đại diện, nhưng thay vào đó, viết một .txttệp mà bạn có thể chuyển vào xargsđể thực hiện sao chép, ví dụ:

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

Có thể điều này hữu ích cho bạn; nó chỉ là một vài dòng JS nên sẽ dễ dàng điều chỉnh theo nhu cầu của bạn


1

Ngoài ra còn có một mô-đun npm rất hữu ích để làm điều này. Nó không chỉ có thể sao chép mà còn có thể kéo (để cập nhật dữ liệu bạn đã có).

Bạn chỉ cần tạo cấu hình như sau:

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

và làm gitall cloneví dụ. Hoặc làgitall pull


1

Trong trường hợp bất kỳ ai đang tìm kiếm giải pháp Windows, đây là một chức năng nhỏ trong PowerShell để thực hiện thủ thuật (có thể là oneliner / alias nếu không thực tế là tôi cần nó hoạt động cả khi có và không có 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() }
}

1

Vì vậy, trong thực tế, nếu bạn muốn sao chép tất cả các repo từ tổ chức FOOphù hợp BAR, bạn có thể sử dụng một lớp lót bên dưới, yêu cầu jq và các tiện ích cli thông thường

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

1

Một tập lệnh shell khác với các nhận xét sao chép tất cả các kho (công khai và riêng tư) từ người dùng:

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

Tạo bí danh bash / func trong ~/.bashrc file

Tôi đã giải quyết vấn đề này cho nhóm của mình bằng cách tạo bí danh / bash func trong ~/.bashrc file

các bước

mở một thiết bị đầu cuối hoặc trình bao linux và mở ~/.bashrc file:

sudo nano ~/.bashrc

thêm chức năng này:

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
}

lưu và đóng chương trình ~ / .bashrc của bạn rồi đóng thiết bị đầu cuối - bạn cần thực hiện việc này nếu không func mới sẽ không khởi chạy:

mở thiết bị đầu cuối mới và dùng thử:

CloneAll <your_github_org_name>

ví dụ : nếu URL repo github cá nhân của bạn được gọi là https://github.com/awesome-async , lệnh sẽ là

CloneAll awesome-async

Quan trọng

các per_page=200vào cuối của biến đầu tiên ORG_URLđặt số Repos sẽ được nhân bản, vì vậy đặc biệt chú ý rằng:

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

Hi vọng điêu nay co ich! :)


Có vẻ như tối đa giá trị cho per_page là 100 ... cho số trang lớn của tổ chức được thêm vào làm tham số thứ 2 và nó hoạt động hoàn hảo cho nhu cầu của tôi...repos?page=${2}&per_page=100";
sv3n

0

Bạn có thể lấy danh sách các kho bằng cách sử dụng curlvà sau đó lặp lại danh sách đã nói bằng một vòng lặp 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


0

Để chỉ sao chép các kho lưu trữ riêng tư, được cung cấp khóa truy cập và đã cung cấp python 3 và mô-đun yêu cầu được cài đặt:

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

Một giải pháp Python3 bao gồm phân trang đầy đủ thông qua Link Header.

Điều kiện tiên quyết:


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

Sau đó, bạn có thể sử dụng xargshoặc song song và:cat repolist | parallel -I% hub clone %


0

Nếu bạn có danh sách các kho trong một danh sách như thế này, thì tập lệnh shell này sẽ hoạt động:

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

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

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

do

   echo $user"$i"

   git clone $user"$i"

done 

nếu có một số kho lưu trữ riêng tư, bạn có thể cập nhật "user" theo cách này: user = " user: password@github.com/user "
Med Ali Difallah

0

Tôi đã tạo một tập lệnh lô mẫu. Bạn có thể tải xuống tất cả các kho lưu trữ riêng tư / công khai từ github.com. Sau khi một kho lưu trữ được tải xuống, nó sẽ tự động được chuyển đổi thành tệp 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 ..
)

Lưu ý: tệp files.txt chỉ nên chứa các tên kho lưu trữ như:

repository1
repository2

0

Cập nhật từ ngày 19/5

sử dụng lệnh bash này cho một tổ chức (bao gồm repo riêng tư)

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

0

Các câu trả lời phổ biến ở đây không tính đến việc API Github sẽ chỉ trả về tối đa 100 kho lưu trữ bất chấp những gì bạn có thể chỉ định trong per_page . Nếu bạn đang nhân bản một tổ chức Github với hơn 100 kho lưu trữ, bạn sẽ phải theo các liên kết phân trang trong phản hồi API.

Tôi đã viết một công cụ CLI để làm điều đó :

clone-github-org -o myorg

Điều này sẽ sao chép tất cả các kho lưu trữ trong myorgtổ chức vào thư mục làm việc hiện tại.


0

Đối với các tổ chức mà bạn có quyền truy cập với các kho lưu trữ riêng tư:

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

Nó sử dụng html_url, vì vậy bạn không cần access_tokennhập mật khẩu github của mình khi được nhắc.


Xác thực cơ bản bằng mật khẩu cho API không được dùng nữa và sẽ sớm không còn hoạt động. Truy cập [không dùng nữa-password-auth] ( developer.github.com/changes/… ) để biết thêm thông tin về các giải pháp thay thế và ngày xóa được đề xuất.
BogeyMan

@BogeyMan cảm ơn bạn đã cập nhật!
Flavio

0

Sao chép tất cả các repo của bạn không phải là fork:

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

Sao chép ý tưởng của bạ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

Điều này jq lệnh rất phức tạp vì tên repo của GIST là băm, vì vậy lệnh đó concatenates tất cả tên tập tin là tên của repo


Bạn có thể lọc JSON tùy ý bằng cách sử dụng jq

Tải về: sudo apt-get install jq

Trong ví dụ trên, tôi đã lọc ra các nhánh bằng cách sử dụng: curl ... | jq -r 'map(select(.fork == false))' ...- hữu ích để không sao chép các kho lưu trữ mà bạn đã thực hiện các yêu cầu kéo thông thường

jq hỗ trợ một số tính năng rất nâng cao. man jqlà bạn của bạn


Bạn có thể xác thực với curl -u "username" ... để truy cập các kho lưu trữ riêng tư


Các url API của Guthub

  • Repos của bạn (cần xác thực): https://api.github.com/user/repos\?page\=1\&per_page\=100
  • Bất kỳ người dùng nào: https://api.github.com/users/other_username/repos\?page\=1\&per_page\=100
  • Các tổ chức: https://api.github.com/orgs/orgname/repos\?page\=1\&per_page\=100

Tài liệu API Github cho 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

Để sao chép tất cả các kho lưu trữ riêng tư và công khai của riêng bạn, đơn giản hãy tạo mã thông báo truy cập mới với quyền truy cập repos và sử dụng điều này:

(thay thế bằng mã thông báo truy cập và tên người dùng của riêng bạn)

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

Điều này sẽ sao chép tất cả các repo trong thư mục hiện tại

Đây là một chương trình cơ bản nhỏ, bạn chỉ cần dán nó vào thiết bị đầu cuối và nhấn enter

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.