Резервное копирование репозитория GitHub - PullRequest
54 голосов
/ 09 августа 2009

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

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

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

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

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

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

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

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

Ответы [ 6 ]

43 голосов
/ 09 августа 2009

Я не уверен, что это может удовлетворить все ваши требования, но вы можете проверить 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

Сделайте вид, что все ссылки в $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
42 голосов
/ 13 ноября 2010

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

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

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

cd project.git
git remote update

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

git --git-dir project.git remote update
8 голосов
/ 09 августа 2009

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

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

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) весь каталог и обратно , что вверх.

3 голосов
/ 13 января 2013

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

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

0 голосов
/ 10 октября 2010

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

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

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

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

0 голосов
/ 09 августа 2009

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

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