how - push tag github
Pull All Gists de Github? (8)
¿Hay alguna llamada a la API o algún script que no haya podido revertir y que lleve a todos mis Gists de Github a un repositorio de git externo o me devuelva una lista de sus nombres? Sé que cada uno es un repositorio de git separado, así que asumí que lo mejor que puedo hacer es obtener este último, luego un script para incluirlos en mi caja local.
EDIT 1 : Sé que hay que tirar y empujar repositorios git de un servicio a otro, estoy buscando específicamente personas que tengan el 411 en la recopilación de una lista autorizada de todos los Gists que tengo, privados y públicos. También pensé que esto podría ser útil para otros. No se trata tanto de la migración, sino de una estrategia de copia de seguridad. . . de clases
EDIT 2 : Por lo tanto, parece que esto podría no ser posible. Aparentemente no busqué en Google lo suficiente como para buscar la API de Github / Gist actualizada . Las otras llamadas a la API funcionan con comandos curl simples, pero no con la API v1 para Gist. Aún así, la API dice TBD para todos los entusiastas privados y públicos , así que creo que eso pone todo en juego a menos que un alma iluminada enganche un brotha.
$ 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
$
Este no funciona tan caliente.
$ curl https://gist.github.com/api/v1/:format/gists/:alharaka
$ echo $?
0
$
EDITAR 3 : Antes de que me pidan, noté que hay una diferencia en la versión de la API; Este "hack brillante" tampoco ayudó. Aún así, muy bien.
$ curl https://gist.github.com/api/v2/:format/gists/:alharaka # Notice v2 instead of v1
$ echo $?
0
$
Además de las pocas respuestas de Thomas Traum . Parece que el agente de usuario es un deber ahora: http://developer.github.com/v3/#user-agent-required .
Así que hice mi propio ejercicio en: https://github.com/sanusart/gists-backup . Es consciente de la paginación, las descripciones duplicadas y las descripciones faltantes también.
Basándome en la sugerencia de esta respuesta , escribí este sencillo script de Python, que es el truco para mí.
Este es un código muy pequeño, sin apenas verificación de errores, y clona todas las indicaciones del usuario en el directorio actual.
#!/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''])
Vea https://gist.github.com/SpotlightKid/042491a9a2987af04a5a para una versión que también maneja actualizaciones.
Escribí un guión de node.js rápido como un ejercicio, descargo todas las gistas y las guardo con el mismo nombre de archivo que la gist original en una carpeta que coincide con el nombre de "descripción de 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 ));
}
});
});
}
});
Hay una adaptación en API v3 del script de nicerobot , que fue escrito inicialmente para 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
La versión 3 de la API de GitHub permite esto de una manera bastante simple:
https://api.github.com/users/koraktor/gists
le proporciona una lista de todas las Gist del usuario y esa lista ofrece una cantidad diferente de URL, incluidas las API para las Gists individuales como
https://api.github.com/gists/921286
Ver la documentación de Gists API v3 .
Si todo lo que necesita hacer es descargar todos los gists de un usuario particular, entonces este simple script de Python ayudará.
La información de gists para un usuario particular se expone vía API
"https://api.github.com/users/" + username + "/gists"
Simplemente puede recorrer el JSON expuesto por la API, obtener una lista de gistas, realizar una clonación o simplemente descargar las gistas utilizando la URL sin formato especificada. El script simple que se encuentra a continuación recorre el JSON, extrae el nombre del archivo y la url sin procesar, descarga todos los datos y lo guarda en la carpeta local.
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))
Una versión de la secuencia de comandos de @Fedir que da cuenta de la paginación de Github (si tiene unos cientos de 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])
Esta gema rubí parece ayudar a tu problema. No lo he probado todavía, pero parece prometedor.
primero
gem install gisty
Y tienes que poner
export GISTY_DIR="$HOME/dev/gists"
en tu .bashrc o .zshrc Este directorio es donde guardaste tus gists.
necesitas
git config --global github.user your_id
git config --global github.token your_token
Agregue la configuración anterior en su .gitconfig
Uso
gisty post file1 file2 ...
publica file1 y file2 en tu gist
gisty private_post file1 file2 ...
publica file1 y file2 en privado
sincronización gisty
Sincroniza con todas tus ideas.
gisty pull_all
Tirar al repositorio local
lista de gisty
Listar los reposes locales clonados