2011-07-10 28 views
16

Có một cuộc gọi API hay bất kỳ tập lệnh nào mà tôi không thể lật đổ mà sẽ kéo tất cả Gists của tôi từ Github sang một repo git bên ngoài hoặc chỉ trả lại cho tôi một danh sách tên của họ? Tôi biết mỗi người là một repo git riêng biệt, vì vậy tôi đã giả định tốt nhất tôi có thể làm là có được sau này, sau đó kịch bản để có được tất cả chúng vào hộp địa phương của tôi.Kéo tất cả Gists khỏi Github?

EDIT 1: Tôi biết về kéo và đẩy Repos git từ một dịch vụ khác, tôi đặc biệt tìm kiếm những người có 411 trên thu thập một danh sách có thẩm quyền của tất cả các GIST tôi có, tư nhân và công cộng. Tôi cũng nghĩ rằng điều này có thể hữu ích cho người khác. Nó không phải là quá nhiều về di cư, nhưng là một chiến lược sao lưu. . . của các loại.

EDIT 2: Vì vậy, có vẻ như điều này có thể không thực hiện được. Tôi dường như không phải là Google hard enough to search the updated Github/Gist API. Các cuộc gọi API khác hoạt động với các lệnh curl đơn giản, nhưng không hoạt động với API phiên bản 1 cho Gist. Tuy nhiên, API nói TBD cho tất cả Gists riêng và công khai, vì vậy tôi nghĩ rằng đặt cabash trên toàn bộ điều trừ khi một linh hồn giác ngộ móc một brotha lên.

$ curl http://github.com/api/v2/json/repos/show/alharaka 
{"repositories":[{"url":"https://github.com/alharaka/babushka","has_wiki":true,"homepage":"http: 
... # tons of more output 
echo $? 
0 
$ 

Cái này không hoạt động quá nóng.

$ curl https://gist.github.com/api/v1/:format/gists/:alharaka 
$ echo $? 
0 
$ 

EDIT 3: Trước khi tôi nhận được yêu cầu, tôi nhận thấy có một sự khác biệt trong phiên bản API; "hack tuyệt vời" này cũng không giúp được gì. Vẫn còn rất mát mẻ mặc dù.

$ curl https://gist.github.com/api/v2/:format/gists/:alharaka # Notice v2 instead of v1 
$ echo $? 
0 
$ 
+0

Tôi nghĩ câu hỏi này cần mô tả rõ ràng hơn về những gì bạn đang cố gắng làm. – Soren

+0

Tôi đã đoán trước điều đó. Xem ở trên. Nếu nó chưa rõ ràng, không chắc chắn làm thế nào để làm cho nó rõ ràng: API cho phép tôi sử dụng JSON, xác thực hay không, để kéo dữ liệu về repos * hoặc * ghi vào chúng. Khá tuyệt, tôi phải nói. Tuy nhiên, chức năng chưa phải là tất cả. – songei2f

+0

https://gist.github.com/1622504 – endolith

Trả lời

18

Phiên bản 3 của API GitHub cho phép này một cách khá đơn giản:

https://api.github.com/users/koraktor/gists 

cung cấp cho bạn một danh sách tất cả các GIST của người sử dụng và danh sách đó cung cấp một lượng khác nhau của URL bao gồm API URL cho từng Gists riêng lẻ như

https://api.github.com/gists/921286 

Xem Gists API v3 documentation.

+0

Quên bình luận một lúc trở lại. Điều này có vẻ đầy hứa hẹn. Khi tôi có một hệ thống để làm việc với điều này, tôi sẽ lấy lại cho bạn. Cảm ơn. – songei2f

+1

Tôi đã thử nghiệm tính năng này và nó không liệt kê tất cả các giao diện cho người dùng – Brad

+1

Xin lưu ý rằng liên kết ở trên sẽ chỉ nhận được tất cả các ý chính trên trang đầu tiên. Nếu bạn cần truy cập tất cả các ý chính, sau đó đặt "? Page = " ở cuối URL, theo mặc định nó sẽ mở trang "1" đầu tiên. –

1

This ruby gem dường như giúp bạn giải quyết vấn đề. Tôi chưa thử, nhưng có vẻ đầy hứa hẹn.

Đầu tiên

gem install gisty 

Và bạn cần phải đặt

export GISTY_DIR="$HOME/dev/gists" 

trong .bashrc hoặc zshrc dir Đây là nơi các GIST bạn lưu.

bạn cần phải

git config --global github.user your_id 
git config --global github.token your_token 

thêm trên cấu hình trên .gitconfig bạn

Cách sử dụng

  • gisty bài file1 file2 ...

    bài viết file1 file2 và để ý chính của bạn

  • gisty private_post file1 file2 ...

    bài viết file1 file2 và tư nhân

  • gisty sync

    Sync để tất cả các GIST bạn

  • gisty pull_all

    Kéo để repo địa phương

  • danh sách gisty

    Danh sách nhân bản Repos ý chính địa phương

+0

Do thay đổi api, github.token không hoạt động ngay bây giờ. – weakish

+0

Nó sử dụng OAuth ngay bây giờ. Hoạt động tốt như bài viết này với v3 của API Gist! –

2

Tôi đã viết một kịch bản Node.js nhanh chóng như một bài tập, tải tất cả các GIST và lưu chúng với cùng tên tệp với tư cách là gist gốc trong một thư mục khớp với tên "mô tả gist". https://gist.github.com/thomastraum/5227541

var request = require('request') 
    , path = require('path') 
    , fs = require('fs') 
    , url = "https://api.github.com/users/thomastraum/gists" 
    , savepath = './gists'; 

request(url, function (error, response, body) { 

    if (!error && response.statusCode == 200) { 

     gists = JSON.parse(body); 
     gists.forEach(function(gist) { 

      console.log("description: ", gist.description); 
      var dir = savepath + '/' + gist.description; 

      fs.mkdir(dir, function(err){ 
       for(var file in gist.files){ 

        var raw_url = gist.files[file].raw_url; 
        var filename = gist.files[file].filename; 

        console.log("downloading... " + filename); 
        request(raw_url).pipe(fs.createWriteStream(dir + '/' + filename)); 
       } 
      }); 
     }); 

    } 

}); 
13

an adaptation in API v3 của nicerobot's script, ban đầu được viết cho API v1:

#!/usr/bin/env python 
# Clone or update all a user's gists 
# curl -ks https://raw.github.com/gist/5466075/gist-backup.py | USER=fedir python 
# USER=fedir python gist-backup.py 

import json 
import urllib 
from subprocess import call 
from urllib import urlopen 
import os 
import math 
USER = os.environ['USER'] 

perpage=30.0 
userurl = urlopen('https://api.github.com/users/' + USER) 
public_gists = json.load(userurl) 
gistcount = public_gists['public_gists'] 
print "Found gists : " + str(gistcount) 
pages = int(math.ceil(float(gistcount)/perpage)) 
print "Found pages : " + str(pages) 

f=open('./contents.txt', 'w+') 

for page in range(pages): 
    pageNumber = str(page + 1) 
    print "Processing page number " + pageNumber 
    pageUrl = 'https://api.github.com/users/' + USER + '/gists?page=' + pageNumber + '&per_page=' + str(int(perpage)) 
    u = urlopen (pageUrl) 
    gists = json.load(u) 
    startd = os.getcwd() 
    for gist in gists: 
     gistd = gist['id'] 
     gistUrl = 'git://gist.github.com/' + gistd + '.git' 
     if os.path.isdir(gistd): 
      os.chdir(gistd) 
      call(['git', 'pull', gistUrl]) 
      os.chdir(startd) 
     else: 
      call(['git', 'clone', gistUrl]) 
     if gist['description'] == None: 
      description = '' 
     else: 
      description = gist['description'].encode('utf8').replace("\r",' ').replace("\n",' ') 
     print >> f, gist['id'], gistUrl, description 
+0

tuyên bố curl có vẻ là: curl -ks https://gist.githubusercontent.com/fedir/5466075/raw/gist-backup.py | USER = fedir python – philshem

+0

@philshem Cảm ơn, chính xác, github đã thay đổi URL, tôi đã cập nhật câu trả lời. –

+0

hoạt động đẹp mắt cảm ơn bạn! :) – Atlas7

5

Một phiên bản của kịch bản @Fedir 's mà chiếm Github pagination (nếu bạn có một vài trăm gists):

#!/usr/bin/env python 
# Clone or update all a user's gists 
# curl -ks https://raw.github.com/gist/5466075/gist-backup.py | USER=fedir python 
# USER=fedir python gist-backup.py 

import json 
import urllib 
from subprocess import call 
from urllib import urlopen 
import os 
import math 
USER = os.environ['USER'] 

perpage=30.0 
userurl = urlopen('https://api.github.com/users/' + USER) 
public_gists = json.load(userurl) 
gistcount = public_gists['public_gists'] 
print "Found gists : " + str(gistcount) 
pages = int(math.ceil(float(gistcount)/perpage)) 
print "Found pages : " + str(pages) 

f=open('./contents.txt', 'w+') 

for page in range(pages): 
    pageNumber = str(page + 1) 
    print "Processing page number " + pageNumber 
    pageUrl = 'https://api.github.com/users/' + USER + '/gists?page=' + pageNumber + '&per_page=' + str(int(perpage)) 
    u = urlopen (pageUrl) 
    gists = json.load(u) 
    startd = os.getcwd() 
    for gist in gists: 
     gistd = gist['id'] 
     gistUrl = 'git://gist.github.com/' + gistd + '.git' 
     if os.path.isdir(gistd): 
      os.chdir(gistd) 
      call(['git', 'pull', gistUrl]) 
      os.chdir(startd) 
     else: 
      call(['git', 'clone', gistUrl]) 
+0

Cải thiện hiệu quả. Nó có vẻ là, những gì trang itteration nên bắt đầu từ 1 và không 0, nếu không bạn sẽ không lấy trang cuối cùng. –

+0

Kịch bản tốt, dễ dàng được áp dụng để nó cũng có thể sử dụng các nút riêng tư. –

+0

Tôi làm cách nào để sử dụng tập lệnh này để kéo các bí quyết bí mật của mình? – yeedle

1

Ngoài Thomas Traum's vài câu trả lời. Có vẻ như đại lý người dùng hiện tại phải là: http://developer.github.com/v3/#user-agent-required.

Vì vậy, tôi đã tập thể dục của riêng mình tại: https://github.com/sanusart/gists-backup. Nó cũng nhận thức được phân trang, mô tả trùng lặp và mô tả còn thiếu.

+0

tập lệnh đó không còn hoạt động –

+0

Đúng. Cập nhật nó một chút. – sanusart

2

Dựa trên gợi ý trong this answer, tôi đã viết kịch bản lệnh Python đơn giản này, điều này thực hiện thủ thuật cho tôi.

Đây là mã rất nhỏ, hầu như không có bất kỳ kiểm tra lỗi nào và sao chép tất cả các nút của người dùng vào thư mục hiện tại.

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
"""Clone all gists of GitHub username given on the command line.""" 

import subprocess 
import sys 
import requests 

if len(sys.argv) > 1: 
    gh_user = sys.argv[1] 
else: 
    print("Usage: clone-gists.py <GitHub username>") 
    sys.exit(1) 

req = requests.get('https://api.github.com/users/%s/gists' % gh_user) 

for gist in req.json(): 
    ret = subprocess.call(['git', 'clone', gist['git_pull_url']]) 
    if ret != 0: 
     print("ERROR cloning gist %s. Please check output." % gist['id']) 

Xem https://gist.github.com/SpotlightKid/042491a9a2987af04a5a cho phiên bản xử lý cập nhật.

+0

cái này phù hợp với tôi! –

0

Nếu tất cả những gì bạn cần làm là tải xuống tất cả các liên kết từ một người dùng cụ thể, thì tập lệnh python đơn giản này sẽ giúp ích.

Thông tin GIST cho một người dùng cụ thể được tiếp xúc qua API

"https://api.github.com/users/" + username + "/gists" 

Bạn chỉ có thể lặp qua các JSON tiếp xúc bằng API, có được danh sách các GIST, thực hiện sao chép, hoặc đơn giản là tải về GIST sử dụng url thô được chỉ định. Kịch bản lệnh đơn giản dưới đây lặp qua JSON, lấy ra tên tệp và url thô và tải xuống tất cả các nút và lưu nó trong thư mục cục bộ.

import requests 

# Replace username with correct username 
url = "https://api.github.com/users/" + username + "/gists" 

resp = requests.get(url) 
gists = resp.json() 

for gist in gists: 
    for file in gist["files"]: 
     fname = gist["files"][file]["filename"] 
     furl = gist["files"][file]["raw_url"] 
     print("{}:{}".format(fname, furl)) # This lists out all gists 

     Use this to download all gists 
     pyresp = requests.get(furl) 

     with open("../folder/" + fname, "wb") as pyfile: 
      for chunk in pyresp.iter_content(chunk_size=1024): 
       if chunk: 
        pyfile.write(chunk) 
     print("{} downloaded successfully".format(fname)) 
Các vấn đề liên quan