Быстрый бэкап всех ваших репозиториев Github

718d73ad73c34aaf3d43b873b4b6c30c

Я так давно пользуюсь услугами Github, что уже начал забывать, как это страшно потерять код, который целый день сочинял и отлаживал. Раньше для сохранения кода я использовал дискетки, потом cd-rom и переносной жесткий диск, потом пришли флешки. Все это для того, чтобы перенести код с рабочего компьютера на домашний и не потерять. И все эти
устройства постоянно ломались, терялись, у них заканчивался срок службы и т.п.

Потом я завел свои «облака» и хранил код на своем железе и рабочих компьютерах. И наконец появился Github. По началу что-то ещё дублировалось на своих серверах и внешних дисках, но к сегодняшнему дню я настолько привык к сервису Github, все настолько удобно и надёжно, что страх того, что «дискетка» может сломаться, постепенно улетучился.

И тут на тебе! Оказывается, в любой момент, по не зависящим от меня причинам, меня могут отключить от этого технологического чуда!

И ладно бы, если б я ходил на работу и писал неизвестно что, неизвестно зачем. Но у меня-то код весь свой, и кроме него ничего нет. Оказывается, что за время существования Github там у меня завелись сотни репозиториев и просто так — вручную — их не скопируешь.

Тем более, что работаем мы сегодня не на одном компьютере, и понять, где что лежит, сразу невозможно — все лежит в Github-е.

Короче. Слепил я программку для быстрого копирования всех своих репозиториев из Github, из всех своих пользователей и организаций, к которым у меня есть доступ. Программа на Go, потому что я последнее время использую только Go (ну, не считая vue и javascript для webapp).

Программа использует 'gh' (github-cli) и 'git'. С помощью gh получаем список репозиториев, а с помощью git клонируем репозиторий со всей историей коммитов, со всеми ветками и тегами. Это все можно сделать из командной строки, но если у вас много репозиториев, то легче с помощью программы.

Вот эти команды:

$ gh repo list -L 10
$ git clone --mirror git@user-or-org/reponame reponame.git

Как уже говорилось выше, gh выдает список репозиториев, а git клонирует репозиторий со всеми потрохами.

Перед использование программы в gh нужно залогиниться, т.е. выполнить комманду 'gh login' и убедиться, что у вас настроен доступ к Github по ключу ssh.

Далее, полученные архивы можно перенести на любой git-хостинг простыми командами:

$ cd old-repository.git
$ git push --mirror https://github.com/exampleuser/new-repository.git

Программа имеет параметры:

-users  <[user-or-organisation-comma-separated-list]>

здесь указываем список пользователей и(или) организаций, 
разделленые запятыми, архив котрых нужно создать 
(обязательный параметр)

-limit  [user-repo-comma-separated-list]

здесь можно указать список только тех репозиториев, 
которые нужно клонировать, также разделенные запятыми

-output [local-folder-name], default: ./repos

здесь указываем папку, куда нужно записать архивы, 
по умолчанию использется папка ./repos

Пример запуска программы:

$ go run . -users=myuser,myorg -limit=myuser/github-backup -output=./tmp

В этом случае программа будет искать репозитории у пользователя myuser и в организации myorg и загрузит только репозиторий github-backup пользователя myuser, как указано в пареметре -limit, если этот параметр убрать, то будут загружены все репозитории пользователя myuser и организации myorg. Если права для 'gh' и 'git' позволяют вам пользоваться приватными репозиториями, то будут загружены публичные и приватные репозитории, если не позволяют, то только публичные.

Программа размещена в привычном для меня Github, доступ пока еще есть:
https://github.com/kirill-scherba/github-backup

Всё же надеюсь, что доступ к Github у нас останется, но, оказывается, в этом мире бэкап нужен всегда!

Вот ещё один адресс на Gitflic, пока он запасной:
https://gitflic.ru/project/kirill-scherba/github-backup

С уважением,
Kirill Scherba

© Habrahabr.ru