2013-04-10 5 views
12

जहां तक ​​मैं इसे समझता हूं, संदेश काम करने के साथ जुड़े होते हैं। लेकिन जब आप गिटहब पर रेपो देखते हैं तो यह प्रत्येक फ़ाइल द्वारा संदेश को सूचीबद्ध रूप से सूचीबद्ध करता है, क्योंकि जब यह आखिरी बार बदला गया था।गिटहब एपीआई पर - प्रत्येक फ़ाइल से जुड़े अंतिम प्रतिबद्ध संदेश को पाने का सबसे अच्छा तरीका क्या है?

मैं इसे एक रेपो के वेब दृश्य में दोहराना चाहता हूं। गिटहब एपीआई को देखते हुए यह मुझे लगता है कि यह जानकारी प्राप्त करने का एकमात्र तरीका यह है कि सभी कमेट्स (जिसे पेज किया जा सकता है) डाउनलोड करना है, और हालिया लोगों से काम करना जो आपके स्थानीय कैश में फ़ाइलों को संदेश भेजना, जब तक कि प्रारंभिक प्रतिबद्धता

प्रश्न यह है कि यह करने का सही तरीका है, तब तक प्रत्येक फ़ाइल के लिए संदेश प्राप्त होने तक संभावित रूप से पहले ही प्रतिबद्धता के लिए संदेश प्राप्त नहीं हुआ है, ? क्या वह 5000/घंटा कोटा को मारने वाला नहीं है?

+0

मुझे यकीन नहीं है कि मैं पूरी तरह से समझता हूं कि आप क्या हासिल करना चाहते हैं। क्या आप (1) फ़ाइल के लिए नवीनतम टिप्पणी प्राप्त करना चाहते हैं, इससे कोई फर्क नहीं पड़ता कि यह टिप्पणी किससे संबद्ध है? या आप फ़ाइल के लिए नवीनतम प्रतिबद्धता में नवीनतम टिप्पणी प्राप्त करना चाहते हैं? अंतर यह है कि एक फ़ाइल में कई प्रतिबद्धताओं से संबंधित टिप्पणियां हो सकती हैं, और नवीनतम टिप्पणी नवीनतम प्रतिबद्धता में नहीं हो सकती है क्योंकि कोई पिछली प्रतिबद्धता में फ़ाइल पर टिप्पणी कर सकता है। तो, आप इनमें से कौन सा विकल्प चाहते हैं? –

+0

मुझे विकल्प 1 चाहिए, कृपया :) जैसा कि यह आपको गिटहब पर वेब दृश्य में दिखाता है। –

+0

यह आपको दिखाता है कि गिटहब पर वेब दृश्य में? क्या आप मुझे एक उदाहरण के रूप में एक सटीक यूआरएल दे सकते हैं? जब आप गिटहब पर किसी प्रोजेक्ट साइट पर जाते हैं, तो यह आपको फ़ाइलों के लिए प्रतिबद्ध संदेश दिखाता है (उदाहरण के लिए जब आप https://github.com/github/developer.github.com पर जाते हैं तो फ़ाइलों की सूची), प्रतिबद्ध टिप्पणियां नहीं । संदेश प्रतिबद्ध करें और टिप्पणियां दो अलग-अलग चीजें हैं। अगर मैं आपको गलत समझता हूं तो मैं क्षमा चाहता हूं, सिर्फ यह स्पष्ट करना चाहता हूं कि आपको वास्तव में क्या चाहिए। :) –

उत्तर

26

ठीक है, यह पता लगाने के बाद कि आपको जो चाहिए वह प्रत्येक फ़ाइल के लिए नवीनतम प्रतिबद्ध संदेश है, यहां आप क्या कर सकते हैं।

सबसे पहले, अपने भंडार में फ़ाइलों की सूची प्राप्त करें।

1) शाखा के fetch the reference object है कि आप के लिए फ़ाइलों को सूचीबद्ध करना चाहते हैं: ऐसा करने के लिए, आप की जरूरत है

GET https://api.github.com/repos/:owner/:repo/git/refs/heads/:branch 

आप शायद मास्टर शाखा चाहते हैं, इसलिए इस अनुरोध को आप करेंगे का एक उदाहरण है बनाने:

https://api.github.com/repos/izuzak/pmrpc/git/refs/heads/master 

प्रतिक्रिया आप इस तरह दिखेगा मिल जाएगा:

{ 
    "ref": "refs/heads/master", 
    "url": "https://api.github.com/repos/izuzak/pmrpc/git/refs/heads/master", 
    "object": { 
    "sha": "fd6973f430a3367ad718ff049f1b075843913d6f", 
    "type": "commit", 
    "url": "https://api.github.com/repos/izuzak/pmrpc/git/commits/fd6973f430a3367ad718ff049f1b075843913d6f" 
    } 
} 

2) fetch the commit object संदर्भ बिंदु के लिए, प्रतिक्रिया पिछले चरण में प्राप्त की object.url संपत्ति का उपयोग कर कि:

GET https://api.github.com/repos/izuzak/pmrpc/git/commits/fd6973f430a3367ad718ff049f1b075843913d6f 

प्रतिक्रिया आपको मिल जाएगा इस तरह दिखेगा:

{ 
    "sha": "fd6973f430a3367ad718ff049f1b075843913d6f", 
    "url": "https://api.github.com/repos/izuzak/pmrpc/git/commits/fd6973f430a3367ad718ff049f1b075843913d6f", 
    "html_url": "https://github.com/izuzak/pmrpc/commits/fd6973f430a3367ad718ff049f1b075843913d6f", 
    "author": { 
    "name": "Ivan Zuzak", 
    "email": "[email protected]", 
    "date": "2013-04-09T08:55:45Z" 
    }, 
    "committer": { 
    "name": "Ivan Zuzak", 
    "email": "[email protected]", 
    "date": "2013-04-09T08:55:45Z" 
    }, 
    "tree": { 
    "sha": "f5f5de80f67dd794ffbd4abb855fb7d1a573660e", 
    "url": "https://api.github.com/repos/izuzak/pmrpc/git/trees/f5f5de80f67dd794ffbd4abb855fb7d1a573660e" 
    }, 
    "message": "fix typos", 
    "parents": [ 
    { 
     "sha": "d3617ae56dda793131e743b2ff394984bbab6ca3", 
     "url": "https://api.github.com/repos/izuzak/pmrpc/git/commits/d3617ae56dda793131e743b2ff394984bbab6ca3", 
     "html_url": "https://github.com/izuzak/pmrpc/commits/d3617ae56dda793131e743b2ff394984bbab6ca3" 
    } 
    ] 
} 

3) पिछले चरण में प्राप्त प्रतिबद्ध वस्तु के fetch the tree object। पिछले चरण के जवाब में प्रदान की tree.url लिंक का पालन करके यह कर देगा:

GET https://api.github.com/repos/izuzak/pmrpc/git/trees/f5f5de80f67dd794ffbd4abb855fb7d1a573660e 

प्रतिक्रिया इस तरह दिखेगा:

{ 
    "sha": "f5f5de80f67dd794ffbd4abb855fb7d1a573660e", 
    "url": "https://api.github.com/repos/izuzak/pmrpc/git/trees/f5f5de80f67dd794ffbd4abb855fb7d1a573660e", 
    "tree": [ 
    { 
     "mode": "100644", 
     "type": "blob", 
     "sha": "726f21a4adec8c24c2fab6cf5b455d094a8b21bf", 
     "path": "LICENSE.markdown", 
     "size": 568, 
     "url": "https://api.github.com/repos/izuzak/pmrpc/git/blobs/726f21a4adec8c24c2fab6cf5b455d094a8b21bf" 
    }, 
    { 
     "mode": "100644", 
     "type": "blob", 
     "sha": "eb94760b81441b34a73d1b085d9f153ae48b0e63", 
     "path": "README.markdown", 
     "size": 5772, 
     "url": "https://api.github.com/repos/izuzak/pmrpc/git/blobs/eb94760b81441b34a73d1b085d9f153ae48b0e63" 
    }, 
    { 
     "mode": "040000", 
     "type": "tree", 
     "sha": "2e72b217b8644ce6874cda03387a7ab2d8eee55e", 
     "path": "examples", 
     "url": "https://api.github.com/repos/izuzak/pmrpc/git/trees/2e72b217b8644ce6874cda03387a7ab2d8eee55e" 
    }, 
    { 
     "mode": "100644", 
     "type": "blob", 
     "sha": "64b0dbe4981759c0f9640c8e882c97c7324fc798", 
     "path": "pmrpc.js", 
     "size": 24546, 
     "url": "https://api.github.com/repos/izuzak/pmrpc/git/blobs/64b0dbe4981759c0f9640c8e882c97c7324fc798" 
    } 
    ] 
} 

इन सभी फ़ाइलों और भंडार में फ़ोल्डर हैं। ध्यान दें कि फ़ोल्डरों के लिए आपको फ़ोल्डर में फ़ाइलों की सूची प्राप्त करने के लिए फ़ोल्डर पेड़ ऑब्जेक्ट को रिकर्सिव रूप से लाने की आवश्यकता होगी। उपर्युक्त प्रतिक्रिया में, examples एक फ़ोल्डर है जिसे आप प्रकार की संपत्ति के वृक्ष मूल्य से देख सकते हैं। ,

GET https://api.github.com/repos/izuzak/pmrpc/git/trees/2e72b217b8644ce6874cda03387a7ab2d8eee55e 

एक वैकल्पिक दृष्टिकोण सिर्फ एक अनुरोध के साथ (सभी फ़ोल्डर में) सभी फाइलों की सूची प्राप्त करने के लिए है recursive=1 पैरामीटर का उपयोग कर: तो, आप फ़ोल्डर के साथ प्रदान की यूआरएल पर एक और GET अनुरोध में होगा , जैसा कि here वर्णित है। मेरा सुझाव है कि आप इस दृष्टिकोण का उपयोग करें क्योंकि इसे केवल एक ही HTTP अनुरोध की आवश्यकता है।

इसके बाद, अब आप रेपो में फ़ाइलों और फ़ोल्डरों की सूची है, आप get the last commit फ़ाइलें/फ़ोल्डर में से प्रत्येक के लिए बदल जाएगा। ऐसा करने के लिए, इस अनुरोध को

GET https://api.github.com/repos/:user/:repo/commits?path=FILE_OR_FOLDER_PATH 

तो, उदाहरण के लिए, इस ऊपर उल्लेख किया examples फ़ोल्डर के लिए प्रतिबद्ध लाने के लिए एक अनुरोध है:

GET https://api.github.com/repos/izuzak/pmrpc/commits?path=examples 

प्रतिक्रिया आपको मिल जाएगा की एक सूची है वस्तु के लिए प्रतिबद्ध है, और आप सिर्फ इतना है कि सूची में पहले वस्तु पर गौर करना चाहिए (आपके द्वारा पिछली बार फ़ाइल के लिए प्रतिबद्ध में रुचि रखते हैं) और commit.message संपत्ति को पुनः प्राप्त संदेश आपको चाहिए:

[ 
    { 
    "sha": "3437f015257683a86e3b973b3279754df9ac2b24", 
    "commit": { 
     "author": { ... }, 
     "committer": { ... }, 
     "message": "change mode", 
     "tree": { ... }, 
     "url": "https://api.github.com/repos/izuzak/pmrpc/git/commits/3437f015257683a86e3b973b3279754df9ac2b24", 
     "comment_count": 0 
    }, 
    ... 
    }, 
    { 
    ... 
    } 
] 

इस मामले में, नवीनतम के लिए संदेश के लिए प्रतिबद्ध है कि फ़ोल्डर examples है बदल "परिवर्तन मोड।"

तो, मूल रूप से, आप फ़ाइलों की सूची लाने में 3 HTTP अनुरोध बनाने की जरूरत है, और फिर प्रत्येक फ़ाइल और फ़ोल्डर के लिए 1 HTTP अनुरोध। बुरी खबर यह है कि यदि आपके पास बहुत सारी फाइलें हैं - तो आप बहुत सारे HTTP अनुरोध करेंगे। अच्छी खबर यह है कि आप प्रतिक्रियाओं को कैश कर सकते हैं ताकि आप अगर कुछ भी नहीं बदला (अधिक जानकारी के लिए here देखें) अनुरोध करने की जरूरत नहीं है है। इसके अलावा, आप एक बार में सभी के लिए प्रतिबद्ध संदेशों फ़ेच नहीं किया जाएगा, तो आप उन्हें उपयोगकर्ता के रूप में फ़ोल्डर्स के माध्यम से नेविगेट लायेगा (बस GitHub पर के रूप में आप फ़ोल्डरों पर क्लिक करें रूप में)। इस प्रकार आप आसानी से 5000 अनुरोधों की सीमा के भीतर रहने में सक्षम होना चाहिए।

आशा है कि इससे मदद मिलती है! और अगर आपको ऐसा करने का आसान तरीका मिल जाए तो मुझे बताएं :)। मुझे नहीं पता कि यह केवल 1-2 अनुरोधों के साथ इसे प्राप्त करने का एक तरीका है, जो शायद आपको अपेक्षित है।

+1

उत्तर के रूप में चुना गया क्योंकि यह बहुत व्यापक है, धन्यवाद। हालांकि, यह हर फाइल के लिए आखिरी प्रतिबद्धता पाने का आह्वान है जिसे मैं टालने की उम्मीद कर रहा था। मुझे लगता है कि मैं क्या करूँगा एक पृष्ठभूमि क्रॉन नौकरी है जो हर बार कुछ मिलता है, जो इस दर को सीमित करता है। यह महत्वपूर्ण जानकारी नहीं है, लेकिन यह उपयोगी है मुझे लगता है कि –

+0

@MarcosScriven धन्यवाद! और हाँ, मैं समझता हूं कि यह आपके लिए क्यों एक मुद्दा है। हालांकि, क्रॉन जॉब विचार अच्छा लगता है। अच्छा! –

+4

अच्छा! यदि आप केवल नवीनतम प्रतिबद्धता चाहते हैं जो फ़ाइल को प्रभावित करता है, तो आप अपने लिए काम करने के लिए पेजिनेशन का उपयोग कर सकते हैं जैसे 'https प्राप्त करें: //api.github.com/repos/izuzak/pmrpc/commits? Path = example & page = 1 और per_page = 1' – novemberkilo

2

मैं लिस्टिंग रहा हूँ भंडार पर और पहले एक हथियाने और पढ़ने की तुलना में यह SHA है करता है और यह बहुत अच्छा काम करता है:

https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository

में जाओ यह कुछ इस तरह दिखता है:

func GetLatestCommit(owner, repo string, sgc *github.Client) (string, error) { 
    commits, res, err := sgc.Repositories.ListCommits(owner, repo, &github.CommitsListOptions{}) 

    if err != nil { 
     log.Printf("err: %s res: %s", err, res) 
     return "", err 
    } 

    log.Printf("last commit: %s", *commits[0].SHA) 

    return *commits[0].SHA, nil 
} 
0

स्थायी लिंक बनाने की तलाश में, मुझे लगता है कि प्रतिबद्ध शा को पुनः प्राप्त करने का सबसे आसान तरीका है वास्तव में HTML पृष्ठ को पार्स करना है।

लाभ:

  • भंडार में सभी फ़ाइल/फ़ोल्डर पृष्ठों पास है, यहां तक ​​कि जड़
  • एकल HTTP कॉल
  • कोई प्रमाणन लॉगिन जरूरत
  • (कुछ डॉन सही शाखा का उपयोग करेगा 'टी भी शाखाओं में डिफ़ॉल्ट रूप से गुरु का उपयोग करें)
  • काम करता है

प्रत्येक फ़ाइल पेज पर Permalink नामक एक लिंक है। आप देख रहे हैं कि लिंक की पहचान करने के तरीके के लिए वहाँ वर्ग .js-permalink-shortcut और भी data-hotkey="y" विशेषता, Getting permanent links to files - Github में वर्णित है।

<a href="/luckydonald/JavaPipBoyServer/blob/a6f4038336ff41463ad527b4ff4fda45642ebc6d/PROTOCOL.md" class="d-none js-permalink-shortcut" data-hotkey="y">Permalink</a> 

तो इस उदाहरण में शा a6f4038336ff41463ad527b4ff4fda45642ebc6d है।

नोट, यह हमेशा प्रदान किया जाएगा, भले ही आप पहले से ही उस प्रतिबद्धता पर हैं।

यदि कोई व्यक्ति इसके द्वारा परमालिंक बनाना पसंद करता है, तो यूआरएल हैश (उदा। #L437-L441 जैसे रेखा संदर्भ) को मैन्युअल रूप से रखा जाना चाहिए (संलग्न)।

संबंधित मुद्दे