사람의 모든 GitHub 저장소 목록을 검색하는 방법은 무엇입니까?


90

우리는 GitHub 계정의 저장소에있는 사람의 모든 프로젝트를 표시해야하는 프로젝트를 진행하고 있습니다.

누구든지 git-user 이름을 사용하여 특정 사람의 모든 git 저장소 이름을 어떻게 표시 할 수 있습니까?

답변:



39

사용 Github에서 API를 :

/users/:user/repos

이렇게하면 모든 사용자의 공용 저장소가 제공됩니다. 개인 저장소를 찾아야하는 경우 특정 사용자로 인증해야합니다. 그런 다음 REST 호출을 사용할 수 있습니다.

/user/repos

모든 사용자의 저장소 를 찾습니다 .

Python에서이를 수행하려면 다음과 같이하십시오.

USER='AUSER'
API_TOKEN='ATOKEN'
GIT_API_URL='https://api.github.com'

def get_api(url):
    try:
        request = urllib2.Request(GIT_API_URL + url)
        base64string = base64.encodestring('%s/token:%s' % (USER, API_TOKEN)).replace('\n', '')
        request.add_header("Authorization", "Basic %s" % base64string)
        result = urllib2.urlopen(request)
        result.close()
    except:
        print 'Failed to get api request from %s' % url

함수에 전달 된 URL은 위의 예에서와 같이 REST URL입니다. 인증 할 필요가없는 경우 인증 헤더 추가를 제거하도록 메서드를 수정하기 만하면됩니다. 그런 다음 간단한 GET 요청을 사용하여 모든 공개 API URL을 가져올 수 있습니다.


27
이렇게하면 결과 집합의 첫 번째 "페이지"만 제공되며 기본적으로 30 개 항목으로 설정됩니다. 를 사용 ?per_page=100하여 최대 금액을 얻을 수 있지만 사용자가 100 개 이상의 리포지토리를 가지고있는 경우 응답과 함께 전송 next되는 HTTP Link헤더의 여러 URL 을 따라야 합니다 .
Potherca 2014 년

2
감사합니다 @Potherca, 내가 찾던 바로 그!
aknuds1

33

curl저장소를 나열 하려면 다음 명령을 시도하십시오 .

GHUSER=CHANGEME; curl "https://api.github.com/users/$GHUSER/repos?per_page=100" | grep -o 'git@[^"]*'

복제 된 URL을 나열하려면 다음을 실행하십시오.

GHUSER=CHANGEME; curl -s "https://api.github.com/users/$GHUSER/repos?per_page=1000" | grep -w clone_url | grep -o '[^"]\+://.\+.git'

비공개 인 경우 API 키 ( access_token=GITHUB_API_TOKEN) 를 추가해야합니다 . 예를 들면 다음과 같습니다.

curl "https://api.github.com/users/$GHUSER/repos?access_token=$GITHUB_API_TOKEN" | grep -w clone_url

사용자가 조직인 경우 /orgs/:username/repos대신 사용 하여 모든 저장소를 반환합니다.

복제하려면 GitHub에서 한 번에 모든 저장소를 복제하는 방법을 참조하십시오.

참고 항목 : 명령 줄을 사용하여 프라이빗 리포지토리에서 GitHub 릴리스를 다운로드하는 방법


9
.NET Framework에 관계없이 처음 100 개의 저장소 만 표시됩니다 per_page=1000.
jm666

2
명령에 -s옵션을 추가하여 curl보기 흉한 진행 표시 줄을 제거 하십시오 .curl -s ...
xmnboy

5
@ jm666이 말했듯이 최대 페이지 크기는 100입니다. 두 번째 페이지를 보려면 다음을 수행하십시오. curl " api.github.com/users/$USER/repos?per_page=100 \ & page = 2"
rscohn2

2
private 예제는 예제에서 작동하지 않으며 / users / "in plural"은 public repos 만 반환합니다. api.github.com/user/repos 로 이동하여 개인 정보를 얻으려면 요청에 토큰을 추가해야합니다.
LeandroCR

2
@kenorb 미스터리가 해결되었습니다. 사용자는 조직이므로 /orgs/:username/repos모든 저장소를 /users/...반환하고 일부를 반환합니다. 이것은 실제로 이상합니다. 사용자 이름은 사용자 또는 조직으로 취급 될 수 있습니다.
학습자 IOS

11

jq가 설치되어 있는 경우 다음 명령을 사용하여 사용자의 모든 공용 저장소를 나열 할 수 있습니다.

curl -s https://api.github.com/users/<username>/repos | jq '.[]|.html_url'

6

아마도 jsonp 솔루션이 필요할 것입니다.

https://api.github.com/users/[user name]/repos?callback=abc

jQuery를 사용하는 경우 :

$.ajax({
  url: "https://api.github.com/users/blackmiaool/repos",
  jsonp: true,
  method: "GET",
  dataType: "json",
  success: function(res) {
    console.log(res)
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


3

NPM 모듈 저장소 는 일부 사용자 또는 그룹의 모든 공용 저장소에 대한 JSON을 가져옵니다. 에서 직접 실행할 수 npx있으므로 아무것도 설치할 필요가 없습니다. 조직이나 사용자를 선택하기 만하면됩니다 (여기에서 "W3C").

$ npx repos W3C W3Crepos.json

그러면 W3Crepos.json이라는 파일이 생성됩니다. Grep은 예를 들어 저장소 목록을 가져 오는 데 충분합니다.

$ grep full_name W3Crepos.json

장점 :

  • 100 개 이상의 리포지토리에서 작동합니다 (이 질문에 대한 많은 답변은 그렇지 않습니다).
  • 입력 할 내용이 많지 않습니다.

단점 :

  • 필요합니다 npx(또는 npm실제로 설치하려는 경우).

3

Python을 사용하여 GitHub 사용자의 모든 공개 저장소 목록을 검색합니다.

import requests
username = input("Enter the github username:")
request = requests.get('https://api.github.com/users/'+username+'/repos')
json = request.json()
for i in range(0,len(json)):
  print("Project Number:",i+1)
  print("Project Name:",json[i]['name'])
  print("Project URL:",json[i]['svn_url'],"\n")

참고


1
이것은 작동하지 않습니다 (아마도 이전 api 버전 용)
OzzyCzech

2
네, 약간의 변화가 있습니다. 내 대답을 편집했으며 이제 잘 작동합니다.
darshanc99

3

이제 멋진 GraphQL API 탐색기 를 사용할 수있는 옵션이 있습니다. .

각 조직의 모든 활성 저장소 목록을 각 언어로 원했습니다. 이 쿼리는 다음을 수행합니다.

{
  organization(login: "ORG_NAME") {
    repositories(isFork: false, first: 100, orderBy: {field: UPDATED_AT, direction: DESC}) {
      pageInfo {
        endCursor
      }
      nodes {
        name
        updatedAt
        languages(first: 5, orderBy: {field: SIZE, direction: DESC}) {
          nodes {
            name
          }
        }
        primaryLanguage {
          name
        }
      }
    }
  }
}


3

조직의 저장소를 찾는 경우-

api.github.com/orgs/$NAMEOFORG/repos

예:

curl https://api.github.com/orgs/arduino-libraries/repos

또한 페이지 매김 문제가있는 경우 모든 이름을 가져 오기 위해 per_page 매개 변수를 추가 할 수 있습니다.

curl https://api.github.com/orgs/arduino-libraries/repos?per_page=100

3

다음은 repos API의 전체 사양입니다.

https://developer.github.com/v3/repos/#list-repositories-for-a-user

GET /users/:username/repos

쿼리 문자열 매개 변수 :

처음 5 개는 위의 API 링크에 설명되어 있습니다. 에 대한 매개 변수 pageper_page다른 문서화하고 자세한 설명에 유용합니다.

  • type(문자열) : 중 하나 일 수 있습니다 all, owner, member. 기본:owner
  • sort(문자열) : 중 하나 일 수 있습니다 created, updated, pushed, full_name. 기본:full_name
  • direction(문자열) : asc또는 중 하나 일 수 있습니다 desc. 기본값 : asc사용시 full_name, 그렇지 않으면desc
  • page (정수) : 현재 페이지
  • per_page (정수) : 페이지 당 레코드 수

이것은 HTTP GET API이므로 cURL 외에도 브라우저에서 간단하게 시도 할 수 있습니다. 예를 들면 :

https://api.github.com/users/grokify/repos?per_page=1&page=2


2

HTML

<div class="repositories"></div>

자바 스크립트

// Github 저장소

당신이 저장소의 목록을 제한하고자한다면, 당신은 추가 할 수 있습니다 ?per_page=3username/repos.

예 : username/repos?per_page=3

/ username/ 대신 Github에 모든 사람의 사용자 이름을 넣을 수 있습니다.

var request = new XMLHttpRequest();
        request.open('GET','https://api.github.com/users/username/repos' , 
        true)
        request.onload = function() {
            var data = JSON.parse(this.response);
            console.log(data);
            var statusHTML = '';
            $.each(data, function(i, status){
                statusHTML += '<div class="card"> \
                <a href=""> \
                    <h4>' + status.name +  '</h4> \
                    <div class="state"> \
                        <span class="mr-4"><i class="fa fa-star mr-2"></i>' + status.stargazers_count +  '</span> \
                        <span class="mr-4"><i class="fa fa-code-fork mr-2"></i>' + status.forks_count + '</span> \
                    </div> \
                </a> \
            </div>';
            });
            $('.repositories').html(statusHTML);
        }
        request.send();

1

페이징 JSON

아래의 JS 코드는 콘솔에서 사용하기위한 것입니다.

username = "mathieucaroff";

w = window;
Promise.all(Array.from(Array(Math.ceil(1+184/30)).keys()).map(p =>
    fetch(`//api.github.com/users/{username}/repos?page=${p}`).then(r => r.json())
)).then(all => {
    w.jo = [].concat(...all);
    // w.jo.sort();
    // w.jof = w.jo.map(x => x.forks);
    // w.jow = w.jo.map(x => x.watchers)
})

1

대답은 "/ users / : user / repo"이지만, 서버에서 웹 애플리케이션을 구축하는 데 사용할 수있는 오픈 소스 프로젝트에이 작업을 수행하는 모든 코드가 있습니다.

모든 저장소 를 나열하는 GitHub API와 통신하는 Git-Captain 이라는 GitHub 프로젝트를 시작했습니다 .

GitHub API를 활용하여 수많은 GitHub 리포지토리에서 브랜치를 찾고, 만들고, 삭제할 수있는 Node.js로 구축 된 오픈 소스 웹 애플리케이션입니다.

조직 또는 단일 사용자 용으로 설정할 수 있습니다.

read-me에도 단계별 설정 방법이 있습니다.


1

사용자의 100 개의 공용 저장소 URL을 가져 오려면 다음을 수행하십시오.

$.getJSON("https://api.github.com/users/suhailvs/repos?per_page=100", function(json) {
  var resp = '';
  $.each(json, function(index, value) {
    resp=resp+index + ' ' + value['html_url']+ ' -';
    console.log(resp);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


1
const request = require('request');
const config = require('config');

router.get('/github/:username', (req, res) => {
    try {
        const options = {

            uri: `https://api.github.com/users/${req.params.username}/repos?per_page=5
                 &sort=created:asc
                 &client_id=${config.get('githubClientId')}
                 &client_secret=${config.get('githubSecret')}`,

            method: 'GET',

            headers: { 'user-agent': 'node.js' }
        };
        request(options, (error, response, body) => {
            if (error) console.log(error);
            if (response.statusCode !== 200) {
                res.status(404).json({ msg: 'No Github profile found.' })
            }
            res.json(JSON.parse(body));
        })
    } catch (err) {
        console.log(err.message);
        res.status(500).send('Server Error!');
    }
});

1
자세한 내용은 git docs-> developer.github.com/v3/repos를
Vishal Kank

1
SO에 오신 것을 환영합니다! 게시하기 전에 이것을 확인하십시오 ... 답변을 게시하고 더 많은 것이있을 때 POV의 장점을 보여주고 코드를 게시하지 말고 조금 설명하십시오.
David García Bodego
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.