如何检索一个人的所有GitHub存储库的列表?


90

我们正在开发一个项目,我们需要在该人的GitHub帐户的存储库中显示该人的所有项目。

谁能建议,我该如何使用特定用户的git-user名称显示其所有git存储库的名称?

Answers:



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。如果您不需要进行身份验证,则只需修改方法即可删除添加的Authorization标头。然后,您可以使用简单的GET请求获取任何公共api网址。


27
这只会给出结果集的第一个“页面”,默认情况下将其设置为30个项目。您可以使用?per_page=100来获得最大数量,但是如果用户有一百个以上的回购,则需要next在HTTPLink标头中跟随响应发送多个URL 。
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 Release


9
这仅显示前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 '17

2
私有示例不适用于该示例,/ users /“复数”仅返回公共存储库。您需要使用api.github.com/user/repos并将令牌添加到请求中以获取私有令牌。
LeandroCR '19

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 Explorer的选项。

我想要一个清单,列出我组织中所有活动的存储库及其各自的语言。这个查询就是这样做的:

{
  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(串):可以是一个allownermember。默认:owner
  • sort(串):可以是一个createdupdatedpushedfull_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>

的JavaScript

// Github仓库

如果您想限制存储库列表,可以在?per_page=3之后添加username/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”,但是我拥有一个开源项目中执行此操作的所有代码,可用于在服务器上站立一个Web应用程序。

我站起来了一个名为Git-Captain的GitHub项目,该项目与列出所有存储库的GitHub API通信。

这是一个使用Node.js构建的开源Web应用程序,利用GitHub API在整个GitHub存储库中查找,创建和删除分支。

可以为组织或单个用户设置。

我逐步介绍了如何在自述文件中进行设置。


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

1
欢迎来到SO!在发布答案之前,请检查此内容。当发布答案时,还有更多其他内容,请显示POV的优点,请不要仅仅发布代码,请对其进行一些解释。
DavidGarcíaBodego,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.