Резервное копирование GitHub хранилища
Каков наилучший способ создания локальной резервной копии репозитория git, размещенного на GitHub, с учетом следующих требований:
Локальная резервная копия должна быть голой.
Резервная копия должна включать все ветви.
Должно быть легко (постепенно) обновить резервную копию.
В принципе, я хочу идеальное зеркало, с возможностью легко обновлять. Таким образом, команда
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.
Я написал сценарий 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, это лучшие инструменты для работы. В противном случае вам придется написать несколько страшных сценариев...