회사 GitHub 계정이 있고 자동화 목적으로 생성 될 수있는 새로운 항목을 고려하여 내부의 모든 저장소를 백업하고 싶습니다. 나는 다음과 같은 것을 바라고 있었다.
git clone git@github.com:company/*.git
또는 유사하게 작동하지만 와일드 카드가 마음에 들지 않는 것 같습니다.
Git에 적절한 권한이 있다고 가정하고 모든 것을 복제 한 다음 가져 오는 방법이 있습니까?
회사 GitHub 계정이 있고 자동화 목적으로 생성 될 수있는 새로운 항목을 고려하여 내부의 모든 저장소를 백업하고 싶습니다. 나는 다음과 같은 것을 바라고 있었다.
git clone git@github.com:company/*.git
또는 유사하게 작동하지만 와일드 카드가 마음에 들지 않는 것 같습니다.
Git에 적절한 권한이 있다고 가정하고 모든 것을 복제 한 다음 가져 오는 방법이 있습니까?
답변:
그렇게 할 수 없다고 생각합니다. 가장 좋은 방법은 API를 사용하여 조직의 저장소 목록을 찾고 반복하는 것입니다.
이 시도:
http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
ssh_url
부동산을 구체적으로 찾고 계실 것입니다 .git clone
각각 ssh_url
의.약간의 추가 작업이 필요하지만 GitHub에 적절한 인증이 필요합니다.
curl -i https://github.com/api/v3/orgs/company/repos?access_token=<token>
https://github.com/api/v3/
시도하십시오 https://api.github.com/
.
/users/${COMPANY}/repos
경로 를 사용하고 싶을 것입니다 /orgs/${COMPANY}/repos
.
access_token
쿼리 매개 변수 사용이 더 이상 사용되지 않으므로 대신 Authorization HTTP 헤더를 사용하세요 . 제어 할 수없는 앱에서이 토큰을 사용하는 경우이 지원 중단으로 인해 작동이 중지 될 수 있습니다.
에 윈도우 및 모든 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
조직의 모든 저장소를 복제하려면 다음 셸 한 줄을 시도하십시오.
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
API 키를 구성한 후 사용하는 것입니다.또한보십시오:
힌트 :
-속도를 높이려면 ( = 4 프로세스)에 -P
대한 매개 변수를 지정하여 병렬 프로세스 수를 설정하십시오 . xargs
-P4
-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 입니다.
리포지토리가 100 개 이상인 경우 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_page
매개 변수는 30
입니다.
계정 설정-> 애플리케이션으로 이동하여 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 에게 감사드립니다 .
그래서 내 대답도 추가하겠습니다. :) (간단하다는 것을 알았습니다)
가져 오기 목록 ( "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
@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
.../orgs/[[organization]]/repos...
하려면 .../users/[[username]]/repos...
. 이제 모든 작업을 다른 로컬 컴퓨터로 빠르게 가져올 수 있습니다. 감사!
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
?page=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
위의 몇 가지 명령과 도구를 시도했지만 너무 번거 롭다고 판단했기 때문에이를 수행하기 위해라는 또 다른 명령 줄 도구를 작성했습니다
github-dl
.
사용하려면 (nodejs가 설치되어 있다고 가정)
npx github-dl -d /tmp/test wires
그러면 CLI에서 제공하는 권한 부여 세부 정보 (사용자 / 패스)를 사용하여 모든 저장소의 목록을 가져 wires
오고 test
디렉터리에 정보를 씁니다 .
자세하게는
실제로 저장소를 복제하지는 않지만 대신 복제를 수행하기 위해 .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 몇 줄이면 필요에 맞게 쉽게 조정할 수 있습니다.
이를 수행하는 데 매우 유용한 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
~/.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
도움이 되었기를 바랍니다! :)
...repos?page=${2}&per_page=100";
을 사용하여 리포지토리 목록을 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
.NET에서 JSON API를 사용합니다 api.github.com
. github 문서에서 코드 예제를 볼 수 있습니다.
https://developer.github.com/v3/
또는 거기 :
https://github.com/artiomn/git_cloner/blob/master/src/git_cloner/github.py
액세스 키와 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;
Link
헤더 를 통한 완전한 페이지 매김을 포함하는 Python3 솔루션입니다 .
전제 조건 :
pip3 install links-from-link-header
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 ..
)
참고 : files.txt 파일에는 다음과 같은 저장소 이름 만 포함되어야합니다.
repository1
repository2
조직의 경우 개인 저장소로 액세스 할 수 있습니다.
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 비밀번호를 입력 할 필요가 없습니다 .
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
명령은 요점의 저장소 이름이 해시이기 때문에 복잡하므로 명령은 모든 파일 이름을 저장소 이름으로 연결합니다.
jq
설치: sudo apt-get install jq
위의 예에서 다음을 사용하여 포크 를 필터링했습니다 curl ... | jq -r 'map(select(.fork == false))' ...
.- 캐주얼 한 pull 요청을 한 저장소를 복제하지 않는 데 유용합니다.
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
https://api.github.com/orgs/orgname/repos\?page\=1\&per_page\=100
"""
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']}...")
모든 개인 및 공용 저장소를 복제하려면 저장소 액세스 권한이있는 새 액세스 토큰을 생성하고 다음을 사용하십시오.
(자신의 액세스 토큰 및 사용자 이름으로 대체)
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 키를 누르면됩니다.