Lifove Story

Github에서 여러 프로젝트 한 번에 clone하기 본문

Lifove Programming

Github에서 여러 프로젝트 한 번에 clone하기

Lifove 2016. 12. 16. 12:07

Github는 보물창고다. 다양한 오픈소스 프로젝트의 개발 히스토리와 소스코드를 쉽게 얻을 수 있다. Mining Software Repository 분야 연구자들에게는 금광과 같은 곳이다. 예를 들면, 내가 만든 버그 찾는 프로그램을 실제 소스코드에 적용해서 정말 버그를 잘 찾는지 알고 싶다면, Github에 있는 수백, 수천개의 오픈소스 프로젝트에 검증해 볼 수 있다. 또, 다양하고 엄청나게 많은 개발 히스토리를 통해 버그 패턴들도 찾아 볼 수 있다. Github에 요즘 각광받는 빅데이터 분야의 기술들을 적용한다면, 해결할 수 있는 잠재적인 소프트웨어 공학 문제들이 많다.


Github에서 옥석을 가리기 전에, 일단 먼저 해야할 일은, 내 서버나 pc로 Github 프로젝트들을 일괄적으로 가져와야 지지고 볶고 할 수 있다. Github는 json기반으로 유용한 api를 제공 해준다. 본 포스팅에서는 Github에 있는 오픈소스 프로젝트를 한꺼번에 여러개 종류별로 clone할 수 있는 몇 가지 유닉스 기반 명령어 팁을 정리해 보았다. https://gist.github.com/caniszczyk/3856584 에 나와 있는 내용을 참고하여 수정 보완 하였다. 모두 텍스트를 처리하는 간단한 명령들이다.


(1) Apache Software Foundation과 같은 기관의 오픈소스 프로젝트 전체 clone하기 (ruby 이용 명령어 한줄로...)


curl -s https://api.github.com/orgs/apache/repos?&page=1\&per_page=100 | ruby -rubygems -e 'require "json"; JSON.load(STDIN.read).each { |repo| %x[git clone #{repo["git_url"]} ]}'


명령어 안 url에서 apache부분이 Github에 등록된 Apache Software Foundation의 고유 이름이다. 다른 기관 고유 이름을 넣으면 해당 기관의 프로젝트도 다 받아올 수 있다. 예를들어 Google은 google을 고유이름으로 가지고 있는데, apache를 google로 바꾸면 Github에 있는 구글 오픈소스 프로젝트들을 clone할 수 있다. 이런 기관들은 본래 사용하는 레포지토리가 있고, Github에 있는 프로젝들은 거의 mirror된 프로젝트이다. Github api가 최대 100개의 프로젝트 목록만 json으로 보여준다. 기관이 100개가 넘는 프로젝트를 가지고 있다면, url상에서 page값을 증가 시키면서 여러번 실행 시켜줘야 한다. 예를 들어 500개 이하의 프로젝트가 있다면, page=1 부터 page=5까지 값을 늘려가면서 실행 해줘야 한다. 간단한 스크립트를 만들어서 batch로 실행하면 되겠다.


(2) 특정 github사용자의 특정 언어로 개발된 오픈소스 프로젝트만 가져올 경우


for i in 1 2 3 4 5

do

        for giturl in `curl  -s "https://api.github.com/search/repositories?q=language:Java+user:apache&page=$i&per_page=100" |grep git_url | cut -d ':' -f 2-3|tr -d '",'`;

        do

                git clone $giturl;

        done

done


위 쉘 스크립트의 url은 처음에 나온 url과 주소가 약간 다르다. Github의 검색 결과를 json을 통해 보여준다. 쿼리 안에 language부분이 Java, user 부분이 apache로 설정이 되어 있다. 사실 language부분을 삭제 하면, 첫번째 명령어가 다를바가 없다. 위 예제에서는 i는 페이지 값을 나타낸다. 1부터 5까지 순차적으로 증가...Github search api에서 사용할 수 있는 다른 옵션들은, [이곳]에서 확인할 수 있다.




이 글이 도움이 되셨으면, 공감을 눌러주세요!

반응형