Вытащить всех Гистов из Гитуба?
Есть ли вызов 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
$
Ответы
Ответ 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))