Backup / Mirror Github хранилища - PullRequest
5 голосов
/ 27 августа 2010

Я хотел бы периодически создавать резервную копию моих репозиториев github.Есть ли быстрый способ вытащить их всех, не зная, что весь список?

Уолтер

Ответы [ 3 ]

2 голосов
/ 10 сентября 2010

Ответ, которого я ждал.

Я решил попробовать Руби, и все в порядке. Мне нравится, как он компактен, но выглядит не очень: (

Это работает:

#!/usr/bin/env ruby
require "yaml"
require "open-uri"

time = Time.new
backupDirectory = "/storage/backups/github.com/#{time.year}.#{time.month}.#{time.day}"
username = "walterjwhite"

#repositories =
# .map{|r| %Q[#{r[:name]}] }

#FileUtils.mkdir_p #{backupDirectory}

YAML.load(open("http://github.com/api/v2/yaml/repos/show/#{username}"))['repositories'].map{|repository|

    puts "found repository: #{repository[:name]} ... downloading ..."
    #exec
    system "git clone git@github.com:#{username}/#{repository[:name]}.git #{backupDirectory}/#{repository[:name]}"
}

Walter

2 голосов
/ 17 декабря 2012

Теперь, когда v2 API, используемый в принятом ответе, больше не работает, пришло время для обновления, использующего Github API v3 .

Вы можете получить список репозиториев в формате JSON с помощью

curl -i https://api.github.com/users/username/repos

Остерегайтесь нумерации страниц! По умолчанию результаты разбиты на страницы до 30 элементов . Если у вас больше репозиториев, чем умещается на одной странице, вы получите заголовок ответа Link HTTP со ссылками на другие страницы (с rel = next / last / first / prev). Вы также можете запросить больший размер страницы (до 100):

curl -i https://api.github.com/users/username/repos?per_page=100

Полный скрипт резервного копирования (при условии, что у вас есть 100 или меньше репозиториев) будет выглядеть примерно так:

#!/usr/bin/python
import os
import json
import urllib
import subprocess

username = 'username'  # specify your github username
os.chdir(os.expanduser('~/github'))  # location for your backups, must exist

url = 'https://api.github.com/users/%s/repos?per_page=100' % username
for repo in json.load(urllib.urlopen(url)):
    print "+", repo['full_name']
    if os.path.exists(repo['name']):
        subprocess.call(['git', 'pull'], cwd=repo['name'])
    else:
        subprocess.call(['git', 'clone', repo['git_url']])
2 голосов
/ 27 августа 2010

Вы можете получить весь список через API GitHub:

curl http://github.com/api/v2/yaml/repos/show/walterjwhite

Например, эта простая однострочная оболочка для DOS / Unix:

ruby -ryaml -ropen-uri -e "puts YAML.load(open('http://github.com/api/v2/yaml/repos/show/walterjwhite'))['repositories'].map {|r| %Q[* **#{r[:name]}** (#{r[:description]}) is at <#{r[:url]}/>] }"

отпечатков (при условии, что у вас установлен Ruby):

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...