GitHub에서 한 번에 모든 저장소를 복제하는 방법은 무엇입니까?


97

회사 GitHub 계정이 있고 자동화 목적으로 생성 될 수있는 새로운 항목을 고려하여 내부의 모든 저장소를 백업하고 싶습니다. 나는 다음과 같은 것을 바라고 있었다.

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

또는 유사하게 작동하지만 와일드 카드가 마음에 들지 않는 것 같습니다.

Git에 적절한 권한이 있다고 가정하고 모든 것을 복제 한 다음 가져 오는 방법이 있습니까?


2
좋은 질문. 그리고 풀을 통해 동기화를 유지하는 것은 어떻습니까? 풀에 대한 답변이 있습니까?
nealmcb

노드 나 루비에 익숙하지 않은 사람들을 위해 파이썬 솔루션이 필요합니다.) 아니면 github가 이것을 읽고 우리를 동정하고 이에 대한 간단한 웹 인터페이스를 제공해야합니다 ....
nealmcb

답변:


52

그렇게 할 수 없다고 생각합니다. 가장 좋은 방법은 API를 사용하여 조직의 저장소 목록을 찾고 반복하는 것입니다.

이 시도:

  • 계정 설정-> 애플리케이션으로 이동하여 API 토큰을 만듭니다.
  • 전화 걸기 : 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입니까?
Thomas Kelley 2013 년

1
아, 오해했습니다. 엔 엔터프라이즈 계정이라고 생각했습니다. 대신 https://github.com/api/v3/시도하십시오 https://api.github.com/.
Thomas Kelley

1
그리고 특정 회사가 어떻게 설정되어 있는지 잘 모르겠지만 "조직"이 아닌 "사용자"인 경우 대신 /users/${COMPANY}/repos경로 를 사용하고 싶을 것입니다 /orgs/${COMPANY}/repos.
Thomas Kelley

1
GitHub 기준 : access_token쿼리 매개 변수 사용이 더 이상 사용되지 않으므로 대신 Authorization HTTP 헤더를 사용하세요 . 제어 할 수없는 앱에서이 토큰을 사용하는 경우이 지원 중단으로 인해 작동이 중지 될 수 있습니다.
BogeyMan

114

윈도우 및 모든 UNIX / LINUX를 사용하는 시스템, 힘내 배쉬 또는 다른 터미널을 대체 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
가장 간단한 순수한 bash 솔루션. 참고로이 bash 코드는 거의 모든 * nix 환경, Linux, Cygwin, Mingw에서 실행할 수 있으며 물론 Gitbash는 실제로 다른 것과 같은 터미널 에뮬레이션입니다.
m3nda

1
이것은 조직에서 작동하지 않으므로 질문에 직접 답하지 않습니다. Kenorb 의이 답변 은 조직을 처리하고 최대 1000 개의 repos에서도 작동합니다.
RichVel

1
인증 : curl " api.github.com/$CNTX/$NAME/… "| grep -e 'git_url *'| 컷은 4 -f "\ -d | -L1 자식 클론 xargs 명령
야닉 WURM

2
답변 업데이트 (2019 년 2 월) : GitHub API v3에 따라 컬은 / orgs / ORGNAME / repos로 이동해야합니다. 또한 API v3에 대한 링크를 포함 할 수 있습니다. developer.github.com/v3 개인 저장소의 경우 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

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쿼리 문자열에 추가 하십시오.
  • 또 다른 방법은 hubAPI 키를 구성한 후 사용하는 것입니다.

또한보십시오:


힌트 :
-속도를 높이려면 ( = 4 프로세스)에 -P대한 매개 변수를 지정하여 병렬 프로세스 수를 설정하십시오 . xargs-P4
-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필요한 경우 설정하십시오 .

최신 정보:

ATutorMe가 언급했듯이 GitHub 문서에 따르면 최대 페이지 크기는 100 입니다.

리포지토리가 100 개 이상인 경우 pageURL에 매개 변수를 추가해야 하며 각 페이지에 대해 명령을 실행할 수 있습니다.

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입니다.


액세스 권한이있는 개인 저장소에 대해 이것이 어떻게 수행되는지 아십니까?
MichaelGofron

두 번째는 앰퍼샌드 발생하지 작업이 백그라운드 작업으로 이동하게 수행
slashdottir

URL에 & access_token = <my_access_token>을 추가했는데 완벽하게 작동했습니다
rmartinus

두 번째 : 페이지 = 1 (!)
Yannick Wurm

5

계정 설정-> 애플리케이션으로 이동하여 API 키를 생성 한
다음 아래 스크립트에 API 키, github 인스턴스 URL 및 조직 이름을 삽입합니다.

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

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
예, 루비가 필요하지 않습니다. 그냥 움켜 쥐고 ...
Xiao-Feng Li

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]]을 github 사용자 이름으로, [[ORGANIZATION]]을 Github 조직으로 바꿉니다. 출력 (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.... 이제 모든 작업을 다른 로컬 컴퓨터로 빠르게 가져올 수 있습니다. 감사!
B. Bulpett 2015 년


2

이 python one-liner는 필요한 작업을 수행합니다. 그것:

  • github에서 사용 가능한 저장소를 확인합니다.
  • 각각에 대해 시스템 호출을 만듭니다. 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

그러면 CLI에서 제공하는 권한 부여 세부 정보 (사용자 / 패스)를 사용하여 모든 저장소의 목록을 가져 wires오고 test디렉터리에 정보를 씁니다 .

자세하게는

  1. 인증 요청 (2FA 지원)
  2. Github API를 통해 사용자 / 조직의 저장소 목록을 가져옵니다.
  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

아마도 이것은 당신에게 유용 할 것입니다. JS 몇 줄이면 필요에 맞게 쉽게 조정할 수 있습니다.


1

이를 수행하는 데 매우 유용한 npm 모듈 도 있습니다 . 복제 할 수있을뿐만 아니라 끌어 올 수도 있습니다 (이미 가지고있는 데이터를 업데이트하기 위해).

다음과 같이 구성을 만듭니다.

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

그리고 gitall clone예를 들어. 또는gitall pull


1

누군가 Windows 솔루션을 찾는 경우, 여기에 PowerShell에서 트릭을 수행하는 작은 기능이 있습니다.

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 및 공통 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 별칭 / 함수를 만듭니다. ~/.bashrc file

내 팀에서 별칭 / bash func를 만들어이 문제를 해결했습니다. ~/.bashrc file

단계

터미널 또는 Linux 셸을 열고 다음을 엽니 다 ~/.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을 저장하고 닫은 다음 터미널을 닫습니다.이 작업을 수행하지 않으면 새 함수가 초기화되지 않습니다.

새 터미널을 열고 사용해보십시오.

CloneAll <your_github_org_name>

: 개인 github repo URL이 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입니다 ... 대규모 조직의 경우 두 번째 매개 변수로 페이지 번호를 추가했으며 내 요구에 완벽하게 작동합니다...repos?page=${2}&per_page=100";
sv3n

0

을 사용하여 리포지토리 목록을 curl가져온 다음 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

액세스 키와 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

Link헤더 를 통한 완전한 페이지 매김을 포함하는 Python3 솔루션입니다 .

전제 조건 :


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 = " 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

5 월 19 일 업데이트

조직에이 bash 명령을 사용하십시오 (개인 저장소 포함).

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가 .NET에서 지정할 수 있음에도 불구하고 최대 100 개의 리포지토리 만 반환한다는 점을 고려하지 않습니다 per_page. 100 개가 넘는 리포지토리가있는 Github 조직을 복제하는 경우 API 응답의 페이징 링크를 따라야합니다.

이를 위해 CLI 도구를 작성했습니다 .

clone-github-org -o myorg

이렇게하면 myorg조직의 모든 저장소 가 현재 작업 디렉토리 에 복제됩니다 .


0

조직의 경우 개인 저장소로 액세스 할 수 있습니다.

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 비밀번호를 입력 할 필요가 없습니다 .


API에 대한 비밀번호를 사용한 기본 인증은 더 이상 사용되지 않으며 곧 더 이상 작동하지 않습니다. 제안 된 해결 방법 및 제거 날짜에 대한 자세한 내용은 [deprecating-password-auth] ( developer.github.com/changes/… )를 방문하세요 .
BogeyMan

@BogeyMan 업데이트 주셔서 감사합니다!
Flavio

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))' ....- 캐주얼 한 pull 요청을 한 저장소를 복제하지 않는 데 유용합니다.

jq 는 몇 가지 고급 기능을 지원합니다. man jq당신의 친구입니다


개인 저장소에 액세스하기 위해 인증 할 수 있습니다.curl -u "username" ...


Guthub의 API URL

  • 저장소 (인증 필요) : 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 문서


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

현재 폴더의 모든 저장소를 복제합니다.

이것은 작은 bash 프로그램입니다. 터미널에 붙여넣고 Enter 키를 누르면됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.