Ответ 1
Чтобы создать зеркало:
git clone --mirror git://github.com/user/project.git
Для обновления:
cd project.git
git remote update
Обновление без изменения текущего каталога:
git --git-dir project.git remote update
Каков наилучший способ создания локальной резервной копии репозитория git, размещенного на GitHub, с учетом следующих требований:
Локальная резервная копия должна быть открытым репо.
Резервная копия должна включать все ветки.
Это должно быть легко (поэтапно) обновить резервную копию.
В принципе, я хочу идеальное зеркало, с возможностью легко обновляться. Таким образом, команда
git clone --mirror git://github.com/...
приходит на ум, но, насколько я могу судить, это не позволяет легко обновить (мне пришлось бы удалить и воссоздать локальную резервную копию). Кроме того, зеркальный вариант для клока git кажется довольно недавним, у меня его нет в некоторых системах, над которыми я работаю (которые имеют несколько более старые версии git).
Какое ваше рекомендуемое решение для такого рода проблем?
Чтобы создать зеркало:
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
Примечание: Кент Фредрик упоминает в комментариях тонкость 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
но, насколько я могу судить, это не позволяет легко обновить (мне пришлось бы удалить и восстановить локальную резервную копию).
Не уверен, что вы подразумеваете под этим, обновление должно быть таким же простым, как
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) весь каталог и обратно.
Если вам нужно просто создать резервные копии репозиториев GitHub, вы можете взглянуть на простой Bash script.
То, что вы задаете, довольно сложно сделать в рамках ограничений 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, это лучшие инструменты для работы. В противном случае вам придется написать некоторые страшные скрипты...
Я написал ruby script с помощью некоторых других:
https://github.com/walterjwhite/project.configuration/blob/master/scripts/github.com.backup.ruby
Это script позволяет мне загружать все мои репозитории. Я использую его, чтобы периодически создавать резервные копии проектов, над которыми я работаю.
Я надеюсь, что это поможет, не стесняйтесь настраивать его. Я думаю, что у него есть ошибка, изредка GitHub будет тайм-аут, а script не справится с этим.