programing

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

sourcejob 2023. 7. 8. 10:50
반응형

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

GitHub 회사 계정이 있는데 자동화를 위해 새로 생성될 수 있는 모든 저장소를 백업하려고 합니다.저는 다음과 같은 것을 바라고 있었습니다.

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

유사한 것도 좋지만, 와일드카드가 마음에 들지 않는 것 같습니다.

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

Windows 및 모든 UNIX/LINUX 시스템에서 Git Bash 또는 다른 터미널을 사용하는 경우USERNAME사용자 이름 및 용도:

CNTX={users|orgs}; NAME={username|orgname}; PAGE=1
curl "https://api.github.com/$CNTX/$NAME/repos?page=$PAGE&per_page=100" |
  grep -e 'clone_url*' |
  cut -d \" -f 4 |
  xargs -L1 git clone
  • CNTX=users그리고.NAME=yourusername모든 리포지토리를 다운로드합니다.
  • CNTX=orgs그리고.NAME=yourorgname조직의 모든 리포지토리를 다운로드합니다.

번 모든 수 있습니다( 최대이크 100므로설올페번이호이지모여든리리다를가있수토포지니정져습올야호해출번것로러바페이을른지기는설▁the이set▁this-▁number▁to▁(▁all최정▁is(▁severalitories).PAGE다운로드할 페이지 번호로 이동합니다.

다음은 위의 작업을 수행하는 셸 스크립트입니다. https://gist.github.com/erdincay/4f1d2e092c50e78ae1ffa39d13fa404e

GitHub CLI를 사용한 간단한 스크립트(API 키 없음)

툴인 GitHub CLI를 을 소개합니다.ghAPI 키가 필요하지 않으며 최대 1000개의 개인 저장소를 처리할 수 있습니다.

처만해당: 로인사용으로 합니다.gh개인 저장소의 경우 다음 메시지를 따릅니다.

gh auth login

이제 새 스토리지 아래에서 원하는 수의 저장소를 복제할 수 있습니다../myorgname폴더를 누릅니다.를 바꿉니다.myorgname조직 이름과 함께:

gh repo list myorgname --limit 1000 | while read -r repo _; do
  gh repo clone "$repo" "$repo"
done

이것은 Mac 또는 Linux에서 작동합니다.

  • Windows에서?Git for Windows의 일부인 Git Bash에서 이 스크립트 실행

세우다

GitHub CLI 도구를 가져오는 방법

  • Mac -brew install gh
  • Linux 또는 Windows - GitHub 설치 안내서 참조

미래 증명: GitHub CLI 도구는 GitHub API가 변경될 때 장기적으로 지원됩니다.이 문제로 인해 일부 오래된 답변이 더 이상 작동하지 않습니다.

선택사항: 기존 체크아웃 업데이트

있는 repo를 가 "" "repo" "repo"의 오류를 확인해야 .gh repo clone다음과 같이:

gh repo list myorgname --limit 1000 | while read -r repo _; do
  gh repo clone "$repo" "$repo" -- -q 2>/dev/null || (
    cd "$repo"
    # Handle case where local checkout is on a non-main/master branch
    # - ignore checkout errors because some repos may have zero commits, 
    # so no main or master
    git checkout -q main 2>/dev/null || true
    git checkout -q master 2>/dev/null || true
    git pull -q
  )
done

팁들

  • 에서 싶지 ./myorgname폴더?두 번째 드롭"$repo"에 대한 인수입니다.gh repo clone을 만듭니다.

결과 필터링하기

  • --no-archived 생략
  • --source이 아닌 것만 합니다.

1000개 이상의 저장소?

이 스크립트는 최대 1000개의 저장소를 처리합니다.gh에서는 GitHub Search API를 사용하여 쿼리당 최대 1000개의 결과를 반환합니다.

이 제한을 해결하려면:

  • 아카이브된 저장소와 분기된 저장소를 생략하는지 확인합니다.
  • 봐를 gh repo list --help 등에 필터링을 , ▁for링필.
  • 하거나, "" " " API"만 사용합니다.gh repo list

배경

저는 그렇게 하는 것은 불가능하다고 생각하지 않습니다.API를 사용하여 조직의 리포지토리 목록을 찾아서 루프하는 것이 가장 좋습니다.

사용해 보십시오.

  • 계정 설정 -> 응용프로그램으로 이동하여 API 토큰 생성
  • 걸기:http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
  • 응답은 JSON 객체 배열이 됩니다.각 개체에는 해당 조직의 리포지토리 중 하나에 대한 정보가 포함됩니다.내 생각에 당신의 경우, 당신은 특히 다음과 같은 것들을 찾을 것입니다.ssh_url소유물.
  • 그리고나서git clone의 그들ssh_urls의

약간의 추가 작업이지만 깃허브가 제대로 인증을 받아야 합니다.

조직 저장소

조직에서 모든 저장소를 복제하려면 다음 셸 One-liner를 사용하십시오.

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

다음은 사용자의 시작 파일에 추가할 수 있는 유용한 셸 기능입니다(+ 사용).

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

param()?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검색할 수 있습니다.
  • 다른 방법은 API 키를 구성한 후 사용하는 것입니다.

참고 항목:


힌트:
합니다.-P 대 매 변 수 개 한 수의 매개 변수입니다.xargs(-P44공정).
GitHub 제한을 높여야 하는 경우 API 키를 지정하여 인증을 시도합니다.
추가--recursive등록된 하위 모듈로 다시 이동하고 중첩된 하위 모듈을 업데이트합니다.

요점은 명령줄에서 한 줄로 작업을 수행합니다.

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

이상의 repos를 당신은 100개의 repos를 해야 할 입니다.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.

일부 스크립트와 함께 Github CLI를 사용하여 네임스페이스 아래의 모든(공용 또는 개인) 저장소를 복제합니다.

gh repo list OWNER --limit 1000 | awk '{print $1; }' | xargs -L1 gh repo clone

에▁where디OWNER사용자 이름 또는 조직 이름일 수 있습니다.

2022년에 여기에 오는 모든 사람들을 위해:

처음 설치

gh extension install matt-bartel/gh-clone-org

그러면 여기 이를 달성하기 위한 꽤 간단한 명령이 있습니다.

gh clone-org my_org_name

Github CLI이제 여기에 내선 번호가 있습니다.첫 번째 명령은 여기서 수행됩니다.

이 확장은 조직 이름별로 기존 리포지토리를 복제하고 업데이트하는 데 도움이 됩니다.

은 제것안된다니입에에서 됩니다.Github CLI이슈 목록은 여기에 있습니다.

그래서 저도 제 답을 추가하겠습니다 :) (간단하다는 걸 알았어요)

목록 가져오기("마젠토" 회사를 사용했습니다):

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

사용하다clone_url에 신대ssh_urlHTTP 액세스를 사용합니다.

자, 모두 복제해 봅시다! :)

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

- 파라미터를 .?access_token=YOURTOKEN

설정 ->으로 이동하여 를 생성합니다.
아래 키,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에게 감사합니다.

이 파이썬 원라이너는 당신이 필요로 하는 것을 할 것입니다.내용:

  • 사용 가능한 리포지토리에 대한 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'))]"
    

저는 제공된 요지 @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 사용자 이름으로, [ORGINATION]을(를) Github 조직으로 바꿉니다.출력(JSON repo 메타데이터)은 간단한 루비 스크립트로 전달됩니다.

# 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

다음은 Python 솔루션입니다.

curl -s https://api.github.com/users/org_name/repos?per_page=200 | python -c $'import json, sys, os\nfor repo in json.load(sys.stdin): os.system("git clone " + repo["clone_url"])'

org_name을 다운로드할 조직 또는 사용자의 이름으로 대체합니다.Windows에서는 Git Bash에서 이를 실행할 수 있습니다.만약 그것이 (당신의 PATH 등에서가 아닌) 파이썬을 찾을 수 없다면, 내가 찾은 가장 쉬운 해결책은 윈도우 10의 아나콘다 설치를 위한 /c/ProgramData/Anaconda3/python과 같이 파이썬을 실제 파이썬 실행 파일의 경로로 바꾸는 것입니다.

Python3와 Github APIv3로 스크립트를 만들었습니다.

https://github.com/muhasturk/gitim

그냥 도망가

./gitim
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

위의 명령어와 도구 중 몇 가지를 사용해 보았지만 너무 번거롭다고 판단하여 이를 수행하기 위한 다른 명령줄 도구를 작성했습니다.

사용 방법(nodejs가 설치되어 있지 않다고 가정)

npx github-dl -d /tmp/test wires

이렇게 하면 모든 레포의 목록을 얻을 수 있습니다.wires 리고정기다니록합그에 를 적으세요.test디렉토리(CLI에서 제공하는 권한 부여 세부 정보(사용자/패스)를 사용합니다.

자세히 말하자면, 그것은.

  1. 인증 요청(2FA 지원)
  2. Github API를 통해 사용자/org에 대한 저장소 목록을 가져옵니다.
  3. 이에 대한 페이지화를 수행하므로 100개 이상의 repo가 지원됩니다.

실제로 저장소를 복제하지 않고 대신 다음과 같이 기록합니다..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의 몇 줄일 뿐이므로 당신의 요구에 쉽게 적응할 수 있을 것입니다.

포크가 아닌 모든 공용 및 개인 저장소 복제:

먼저 인증을 위한 개인 토큰을 만들고, 인증 토큰이 모든 것을 가지고 있는지 확인합니다.repo 권한

curl -u username:token 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

것이.jqrepo 이기 때문에 을 repo gists의 repo로 합니다.


은 다을사임의로있수다습니필터를 사용하여 수 .jq

설치:sudo apt-get install jq

위의 예에서는 다음을 사용하여 포크를 필터링했습니다.curl ... | jq -r 'map(select(.fork == false))' ...임시 꺼내기 요청을 한 저장소를 복제하지 않는유용합니다.

jq는 일부 고급 기능을 지원합니다.man jq 너의 친구야


Github의 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 문서

과 같이 .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

간단한 솔루션:

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

이를 위해 매우 유용한 npm 모듈도 있습니다.복제할 수 있을 뿐만 아니라 이미 보유한 데이터를 업데이트하기 위해 풀링도 수행도 가능합니다.

다음과 같은 구성만 생성하면 됩니다.

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

그리고 합니다.gitall clone예를들면.또는gitall pull

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

사용자로부터 모든 리포지토리(공개 및 비공개)를 복제하는 주석이 포함된 또 다른 셸 스크립트:

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

bash "/func "에서 별칭합니다.~/.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
}

~/.svrc 파일을 저장하고 닫은 다음 터미널을 닫습니다. 이 작업을 수행해야 합니다. 그렇지 않으면 새 함수를 초기화하지 않습니다.

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

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

이것이 도움이 되길 바랍니다! :)

우리는 지금 gh를 사용할 수 있고 그것은 5개의 복제를 병렬로.

export org=<org|gh-handle>
gh repo list $org | cut -f1 | xargs -n 1 -P 5 gh repo clone

더 많은 병렬 작업을 위해 -P 5를 원하는 숫자로 늘릴 수 있습니다.

더 쉬운 방법은 github cli를 사용하여 sshurl을 가져오고 git 명령을 사용하여 복제하는 것입니다.

gh repo list --json sshUrl --jq '.[].sshUrl' | xargs -n1 git clone

다음을사하용리목가수있록다습니져올을리토포지여를 하면 저장소 수 .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

오픈 소스 도구를 사용하여 github 저장소 묶음을 복제할 수 있습니다. https://github.com/artiomn/git_cloner

예:

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

『JSON API』의 합니다.api.github.comgithub 설명서에서 코드 예제를 볼 수 있습니다. https://developer.github.com/v3/

또는 거기:

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

액세스 키가 지정되고 private reposit(개인 저장소)만 복제하고 python 3 및 requests 모듈이 설치된 경우:

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;

Python3를 통한 철저한 입니다.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 %

이와 같은 목록에 리포지토리 목록이 있는 경우 다음 셸 스크립트가 작동합니다.

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

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

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

do

   echo $user"$i"

   git clone $user"$i"

done 

샘플 배치 스크립트를 만들었습니다.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 ..
)

참고: 파일.txt 파일은 다음과 같은 리포지토리 이름만 포함해야 합니다.

repository1
repository2

언급URL : https://stackoverflow.com/questions/19576742/how-to-clone-all-repos-at-once-from-github

반응형