Подтвердить что ты не робот

Вытащить всех Гистов из Гитуба?

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

РЕДАКТИРОВАТЬ 1. Я знаю о том, как вытащить и нажимать репозитории git с одной службы на другую, я специально ищу людей, у которых есть 411, для сбора авторитетного списка всех Gists, которые у меня есть, частных и общественных. Я также подумал, что это может быть полезно для других. Речь идет не столько о миграции, сколько о стратегии резервного копирования., видов.

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

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

Ответ 1

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

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

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

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

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

Ответ 2

Существует адаптация в API v3 nicerobot script, который был первоначально написан для API v1:

#!/usr/bin/env python
# Clone or update all a user 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

Ответ 3

Версия @Fedir script, которая учитывает разбиение страницы Github (если у вас несколько сотен gists):

#!/usr/bin/env python
# Clone or update all a user 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])

Ответ 4

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

    }

});

Ответ 5

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

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

#!/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 для версии, которая также обрабатывает обновления.

Ответ 6

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

Первая

gem install gisty

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

export GISTY_DIR="$HOME/dev/gists"

в вашем .bashrc или .zshrc Этот каталог находится там, где сохранены ваши gists.

вам нужно

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

    сообщения file1 и file2 конфиденциально

  • gisty sync

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

  • gisty pull_all

    Потяните на локальное репо

  • список gisty

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

Ответ 7

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

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

Ответ 8

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

Информация о gists для конкретного пользователя отображается через API

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

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

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