회사 GitHub 계정이 있고 자동화 목적으로 생성 될 수있는 새로운 항목을 고려하여 내부의 모든 저장소를 백업하고 싶습니다. 나는 다음과 같은 것을 바라고 있었다.
git clone git@github.com:company/*.git
또는 유사하게 작동하지만 와일드 카드가 마음에 들지 않는 것 같습니다.
Git에 적절한 권한이 있다고 가정하고 모든 것을 복제 한 다음 가져 오는 방법이 있습니까?
답변
그렇게 할 수 없다고 생각합니다. 가장 좋은 방법은 API를 사용하여 조직의 저장소 목록을 찾고 반복하는 것입니다.
이 시도:
- 계정 설정-> 애플리케이션으로 이동하여 API 토큰을 만듭니다.
- 전화 걸기 :
http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
- 응답은 객체의 JSON 배열입니다. 각 개체에는 해당 조직 아래의 저장소 중 하나에 대한 정보가 포함됩니다. 귀하의 경우에는 해당
ssh_url
부동산을 구체적으로 찾고 계실 것입니다 . - 그런 다음
git clone
각각ssh_url
의.
약간의 추가 작업이 필요하지만 GitHub에 적절한 인증이 필요합니다.
답변
에 윈도우 및 모든 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 키를 구성한 후 사용하는 것입니다.
또한보십시오:
- GitHub REST API v3-리포지토리 나열
- 명령 줄을 사용하여 비공개 저장소에서 GitHub 릴리스를 다운로드하는 방법 .
- 사람의 모든 github 저장소 목록을 검색하는 방법은 무엇입니까? .
힌트 :
-속도를 높이려면 ( = 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