Вытащить все Gists из Github? - PullRequest
22 голосов
/ 10 июля 2011

Есть ли вызов API или какие-либо сценарии, которые я не смог отменить, чтобы вытащить все мои Gists из Github во внешнее git-репо или просто вернуть мне список их имен?Я знаю, что каждый из них - это отдельное git-репо, поэтому я решил, что лучшее, что я могу сделать, - это получить последний, а затем сценарий, чтобы загрузить их все в мою локальную коробку.

EDIT 1 Я знаю о том, как перетаскивать git-репозитории из одного сервиса в другой, я специально ищу людей, у которых есть 411 для сбора авторитетного списка всех Гистов, частных и публичных. Я тоже так думалможет быть полезным для других.Дело не столько в миграции, сколько в стратегии резервного копирования.,,из сортов.

РЕДАКТИРОВАТЬ 2 : Таким образом, это может быть невозможно.Я, очевидно, не Google достаточно сложно, чтобы искать обновленный Github / Gist API .Другие вызовы API работают с простыми командами curl, но не с API v1 для Gist.Тем не менее, API говорит TBD для всех частных и публичных Gists , поэтому я думаю, что это ставит в тупик все, если только просвещенная душа не зацепит брату.

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

Этотне работает так горячо.

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

РЕДАКТИРОВАТЬ 3 : перед тем, как меня спросили, я заметил, что есть разница в версиях API;этот "блестящий взлом" тоже не помог.Тем не менее, очень круто.

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

Ответы [ 8 ]

19 голосов
/ 17 июля 2011

Версия 3 API GitHub позволяет сделать это довольно простым способом:

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

предоставляет вам список всех Gists пользователя, и этот список предлагает различное количество URL-адресов, включая URL-адреса API для отдельных Gists, таких как

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

См. Документацию Gists API v3 .

13 голосов
/ 26 апреля 2013

Существует адаптация в API v3 сценария nicerobot , который изначально был написан для 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
5 голосов
/ 10 июля 2013

Версия скрипта @Fedir, которая учитывает нумерацию страниц Github (если у вас есть несколько сотен гистов):

#!/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])
3 голосов
/ 02 декабря 2015

Основываясь на подсказке в этом ответе , я написал этот простой скрипт на Python, который помогает мне.

Это очень незначительный код, который практически не проверяется на наличие ошибок и клонирует все сущности пользователя в текущий каталог.

#!/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'])

См. https://gist.github.com/SpotlightKid/042491a9a2987af04a5a для версии, которая также обрабатывает обновления.

2 голосов
/ 14 марта 2014

В дополнение к несколько ответов Томаса Траума . Кажется, что пользовательский агент является обязательным сейчас: http://developer.github.com/v3/#user-agent-required.

Итак, я сделал свое упражнение по адресу: https://github.com/sanusart/gists-backup. Он также осведомлен о подкачке страниц, дублирующихся и отсутствующих описаниях.

2 голосов
/ 24 марта 2013

Я написал быстрый скрипт node.js в качестве упражнения, загружает все гистограммы и сохраняет их с тем же именем файла, что и исходный гист, в папке, которая соответствует имени «gist description».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 ));
                }
            });
        });

    }

});
1 голос
/ 16 августа 2011

Этот рубиновый камень , кажется, поможет вашей проблеме.Я еще не пробовал, но выглядит многообещающе.

Первый

gem install gisty

И вам нужно поместить

export GISTY_DIR="$HOME/dev/gists"

в ваш .bashrc или .zshrc Thisdir - это место, где сохранены ваши гисты.

вам нужно

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

добавить вышеуказанный конфиг в вашем .gitconfig

Использование

  • gisty post file1 file2 ...

    отправляет file1 и file2 в вашу суть

  • gisty private_post file1 file2 ...

    публикует файл1 и файл2 в частном порядке

  • Gisty Sync

    Синхронизация со всеми вашими гистами

  • Gisty Pull_all

    Извлечь в локальное репо

  • Большой список

    Список клонированных локальных репо

0 голосов
/ 20 декабря 2015

Если все, что вам нужно сделать, это загрузить все гистограммы от конкретного пользователя, тогда вам поможет этот простой скрипт на python.

Вы можете просто пройти через JSON, предоставляемый API, получить список гистограмм, выполнить клонирование или просто загрузить гистограммы, используя указанный необработанный URL-адрес.Простой скрипт, приведенный ниже, проходит по JSON, извлекает имя файла и необработанный URL, загружает все списки и сохраняет их в локальной папке.

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