Резервное копирование GitHub хранилища

Каков наилучший способ создания локальной резервной копии репозитория git, размещенного на GitHub, с учетом следующих требований:

  1. Локальная резервная копия должна быть голой.

  2. Резервная копия должна включать все ветви.

  3. Должно быть легко (постепенно) обновить резервную копию.

В принципе, я хочу идеальное зеркало, с возможностью легко обновлять. Таким образом, команда

git clone --mirror git://github.com/...

приходит в голову, но, насколько я могу судить, это не позволяет легко обновлять (я должен был бы удалить и воссоздать мою локальную резервную копию). Кроме того, опция зеркала для git clone появилась совсем недавно, у меня ее нет на некоторых системах, над которыми я работаю (на которых работают более старые версии git).

Каково ваше рекомендуемое решение для такого рода проблемы?

7 ответов

Решение

Чтобы создать зеркало:

git clone --mirror git://github.com/user/project.git

Обновлять:

cd project.git
git remote update

Чтобы обновить без изменения текущего каталога:

git --git-dir project.git remote update

Я не уверен, что это может удовлетворить все ваши требования, но вы можете проверить Git Bundle

git bundle

Эта команда обеспечивает поддержку git fetch а также git pull работать, упаковывая объекты и ссылки в архив на исходной машине, а затем импортируя их в другой репозиторий, используя git fetch а также git pull после перемещения архива каким-то образом

Что мне нравится в этом решении, так это созданный файл, содержащий именно то, что я хочу

git bundle будет упаковывать только те ссылки, которые отображаются с помощью git-show-ref: сюда входят заголовки, теги и удаленные заголовки.

machineA$ git bundle create file.bundle master

Примечание: Kent Fredric упоминает в комментариях тонкость git rev-list:

--all

Притворяться, как будто все ссылки в $GIT_DIR/refs/ перечислены в командной строке как <commit>,

Он добавляет:

ваш текущий пакет будет связывать только родителей коммитов, вам, вероятно, нужно будет указать --all чтобы получить полный пакет всего (ветви, которые являются потомками мастера).

Чтобы увидеть разницу:

$ git bundle create /tmp/foo master
$ git bundle create /tmp/foo-all --all
$ git bundle list-heads /tmp/foo
$ git bundle list-heads /tmp/foo-all

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

Не уверен, что вы подразумеваете под этим, обновление должно быть так просто, как

git fetch

git clone так как он должен извлекать все ссылки / коммиты, которые видны в удаленной ветке.

git clone --mirror также не сильно отличается от git clone --bare [источник]

единственная существенная разница заключается в сокращении git remote add --mirror

(Увидеть git help add за разное поведение)

Если вы действительно беспокоитесь, вы можете сделать это:

git clone --no-hardlinks --mirror $original $dest 

Который будет делать что-то другое, если они все равно были в одной файловой системе.

И если вы действительно параноик, вы можете распаковать (gz|bz2) весь каталог и создать резервную копию.

Если вам просто нужно сделать резервную копию репозиториев GitHub, вы можете взглянуть на простой скрипт Bash.

https://github.com/ptrofimov/github-backup-sh

Я написал сценарий ruby ​​с помощью некоторых других:

https://github.com/walterjwhite/project.configuration/blob/master/scripts/github.com.backup.ruby

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

Я надеюсь, что это помогает, не стесняйтесь настраивать это. Я думаю, что в нем есть ошибка, иногда GitHub отключается, и скрипт не справляется с этим.

Это может быть не точный ответ на сам вопрос, но определенно то, что вам следует подумать, прежде чем писать свои собственные скрипты. Возможным решением может быть резервное копирование репозитория GitHub с помощью действий / приложений из GitHub Marketplace. На торговой площадке доступны несколько вариантов: https://github.com/marketplace?query=backup

Одним из решений может быть создание резервной копии репозитория GitHub с помощью Cloudback . Резервную копию можно загрузить локально или сохранить в одном из самых популярных облачных хранилищ. Посетите на рынке Cloudback страницу или сайт Cloudback для более подробной информации.

То, что вы спрашиваете, довольно сложно сделать в рамках Git. Проблема в том, что ни клонирование, ни выборка не дадут вам все ветви по умолчанию. Смотрите этот вопрос:

Для примера клонирования репо с несколькими ветвями, вот стенограмма:

% git clone -o tufts linux.cs.tufts.edu:/r/ghc/git/experimental.git
Initialized empty Git repository in /usr/local/nr/git/ghc/experimental/.git/
% cd experimental/
% git fetch
% git branch -a
* head
  tufts/HEAD
  tufts/experimental
  tufts/head
  tufts/norman
% git branch --track experimental tufts/experimental
Branch experimental set up to track remote branch refs/remotes/tufts/experimental.
% git branch --track norman tufts/norman
   ...

Вы можете видеть, что клонирование каждой ветви программно будет немного сложнее.

Если github предоставляет доступ к rsync или Unison, это лучшие инструменты для работы. В противном случае вам придется написать несколько страшных сценариев...

Другие вопросы по тегам