จะดึงรายชื่อที่เก็บ GitHub ทั้งหมดของบุคคลได้อย่างไร?


94

เรากำลังทำงานในโครงการที่เราจำเป็นต้องแสดงโครงการทั้งหมดของบุคคลในที่เก็บของเขาในบัญชี GitHub

ใครช่วยแนะนำฉันจะแสดงชื่อของที่เก็บ git ทั้งหมดของบุคคลใดบุคคลหนึ่งโดยใช้ชื่อผู้ใช้ git ได้อย่างไร

คำตอบ:


67

คุณสามารถใช้github apiสำหรับสิ่งนี้ กดปุ่มhttps://api.github.com/users/USERNAME/reposจะแสดงรายการที่เก็บสาธารณะสำหรับผู้ใช้USERNAME


7
คุณยังสามารถเลือกจำนวน repos ที่คุณได้รับจาก?per_page= developer.github.com/v3/#pagination
OzzyCzech

1
api.github.com/users/USERNAME/repos?page=1แสดงผลลัพธ์หน้าแรก (เปลี่ยน 1 เป็น 2 ไปเรื่อย ๆ ค่าเริ่มต้นคือ 30 ผลลัพธ์ต่อหน้า)
stevec

40

ใช้Github API :

/users/:user/repos

สิ่งนี้จะทำให้คุณมีที่เก็บสาธารณะทั้งหมดของผู้ใช้ หากคุณต้องการค้นหาที่เก็บส่วนตัวคุณจะต้องพิสูจน์ตัวตนในฐานะผู้ใช้รายนั้น ๆ จากนั้นคุณสามารถใช้การโทร REST:

/user/repos

เพื่อหาทุก 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 ดังตัวอย่างด้านบน หากคุณไม่จำเป็นต้องตรวจสอบสิทธิ์ให้แก้ไขวิธีการเพื่อลบการเพิ่มส่วนหัวการอนุญาต จากนั้นคุณสามารถรับ URL API สาธารณะโดยใช้คำขอ GET แบบธรรมดา


27
ซึ่งจะให้เฉพาะ "หน้า" แรกของชุดผลลัพธ์ซึ่งกำหนดไว้ที่ 30 รายการโดยค่าเริ่มต้น คุณสามารถใช้?per_page=100เพื่อรับจำนวนสูงสุด แต่ถ้าผู้ใช้มีมากกว่าหนึ่งร้อย repos คุณจะต้องติดตามnextURL หลายรายการในLinkส่วนหัวHTTP ที่ส่งพร้อมกับการตอบกลับ
Potherca

2
ขอบคุณ @Potherca สิ่งที่ฉันกำลังมองหา!
aknuds1

34

ลองใช้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แทนเพื่อส่งคืนที่เก็บทั้งหมด

หากต้องการโคลนโปรดดู: จะโคลน repos ทั้งหมดพร้อมกันจาก GitHub ได้อย่างไร

ดูเพิ่มเติม: วิธีดาวน์โหลด GitHub Release จาก repo ส่วนตัวโดยใช้บรรทัดคำสั่ง


9
สิ่งนี้แสดงเฉพาะที่เก็บ 100 รายการแรกโดยไม่คำนึงถึงไฟล์per_page=1000.
jm666

2
เพิ่ม-sตัวเลือกให้กับcurlคำสั่งของคุณเพื่อกำจัดแถบความคืบหน้าที่ไม่น่าดูเช่นในcurl -s ...
xmnboy

5
ตามที่ @ jm666 บอกขนาดหน้าสูงสุดคือ 100 หากต้องการดูหน้าที่ 2 ให้ทำ: curl " api.github.com/users/$USER/repos?per_page=100 \ & page = 2"
rscohn2

2
ตัวอย่างส่วนตัวใช้ไม่ได้กับตัวอย่าง / users / "in plural" ส่งคืนเฉพาะ repos สาธารณะ คุณต้องไปกับapi.github.com/user/reposและเพิ่มโทเค็นลงในคำขอเพื่อรับโทเค็นส่วนตัว
LeandroCR

2
ความลึกลับของ @kenorb ได้รับการแก้ไขผู้ใช้เป็นองค์กรดังนั้นจึง/orgs/:username/reposส่งคืน repos ทั้งหมด /users/...คืนส่วนของพวกเขานี่เป็นเรื่องแปลกจริงๆ ชื่อผู้ใช้สามารถถือเป็นทั้งผู้ใช้หรือองค์กร
ผู้เรียน ios

11

หากคุณติดตั้งjqคุณสามารถใช้คำสั่งต่อไปนี้เพื่อแสดงรายการ repos สาธารณะทั้งหมดของผู้ใช้

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

reposโมดูล NPM คว้า JSON สำหรับ repos สาธารณะทั้งหมดสำหรับผู้ใช้หรือกลุ่มบางคน คุณสามารถเรียกใช้สิ่งนี้ได้โดยตรงnpxดังนั้นคุณจึงไม่จำเป็นต้องติดตั้งอะไรเลยเพียงแค่เลือกองค์กรหรือผู้ใช้ ("W3C" ที่นี่):

$ npx repos W3C W3Crepos.json

สิ่งนี้จะสร้างไฟล์ชื่อ W3Crepos.json Grep ดีพอที่จะดึงรายการ repos:

$ grep full_name W3Crepos.json

ข้อดี:

  • ทำงานร่วมกับ repos มากกว่า 100 รายการ (คำตอบสำหรับคำถามนี้ไม่มี)
  • ไม่ค่อยมีใครพิมพ์

ข้อเสีย:

  • ต้องใช้npx(หรือnpmหากคุณต้องการติดตั้งจริง)

3

ดึงรายการที่เก็บสาธารณะทั้งหมดของผู้ใช้ GitHub โดยใช้ Python:

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 ที่ยอดเยี่ยม

ฉันต้องการรายชื่อ repos ที่ใช้งานอยู่ทั้งหมดขององค์กรของฉันในภาษานั้น ๆ แบบสอบถามนี้ทำเพียงแค่นั้น:

{
  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

หากกำลังมองหา repos ขององค์กร -

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 ด้านบน พารามิเตอร์สำหรับpageและper_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>

JavaScript

// Github repos

หากคุณต้องการที่จะ จำกัด การเก็บรายการคุณก็สามารถเพิ่มหลัง?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 ชื่อGit-Captainที่สื่อสารกับ GitHub API ที่แสดงรายการ repos ทั้งหมด

เป็นเว็บแอปพลิเคชันโอเพ่นซอร์สที่สร้างด้วย Node.js โดยใช้ GitHub API เพื่อค้นหาสร้างและลบสาขาในที่เก็บ GitHub จำนวนมาก

สามารถตั้งค่าสำหรับองค์กรหรือผู้ใช้คนเดียว

ฉันมีวิธีตั้งค่าทีละขั้นตอนเช่นกันใน read-me


1

ในการรับ URL ที่เก็บสาธารณะ 100 รายการของผู้ใช้:

$.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.