Резервное копирование репозитория GitHub

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

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

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

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

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

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

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

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

Ответ 1

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

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

Для обновления:

cd project.git
git remote update

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

git --git-dir project.git remote update

Ответ 2

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

git bundle

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

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

git bundle будут обрабатывать только пакеты, которые показаны git -show-ref: это главы, теги и удаленные главы.

machineA$ git bundle create file.bundle master

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

--all

Представьте, что все ссылки ref в $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

Ответ 3

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

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

git fetch

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

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

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

(см. git help add для различного поведения)

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

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

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

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

Ответ 4

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

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

Ответ 5

То, что вы задаете, довольно сложно сделать в рамках ограничений 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, это лучшие инструменты для работы. В противном случае вам придется написать некоторые страшные скрипты...

Ответ 6

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

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

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

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