Есть ли простой способ сделать резервную копию всего репозитория git, включая все ветви и теги?
Есть ли простой способ сделать резервную копию всего репозитория git, включая все ветви и теги?
Ответы:
Как насчет просто сделать его клоном?
git clone --mirror other/repo.git
Каждый репозиторий является резервной копией своего удаленного.
git branch -a
. Возможно, это более очевидно: после клонирования репозитория вы не получаете каждую ветку, вы получаете каждый коммит. Ветви только ссылаются на существующий коммит.
git clone
охватывает все это. (1) не является обязательным, не является обязательным требованием. Если результат все еще оптимизирован, это все еще резервная копия (2), уже покрытая самим git. - Смысл, который я хотел бы сказать, состоит в том, что, если git clone
уже охватываются соответствующие пункты, для чего вам нужен другой инструмент? Хотя я также предпочитаю, git bundle
я не думаю, что мой ответ неверен или недействителен. Вы можете рассматривать оба подхода как горячее резервное копирование.
git bundle
Мне нравится этот метод, так как в результате получается всего один файл, который легче копировать.
Смотрите ProGit: маленький пучок радости .
Смотрите также « Как я могу послать кому-нибудь письмо с git-репозиторием? », Где команда
git bundle create /tmp/foo-all --all
подробно:
git bundle
будет упаковывать только те ссылки, которые отображаются в git show-ref : сюда входят заголовки, теги и удаленные заголовки.
Очень важно, чтобы используемая основа удерживалась пунктом назначения.
Можно допустить ошибку, если в файле пакета содержатся объекты, уже находящиеся в месте назначения, так как они игнорируются при распаковке в месте назначения.
Для использования этого пакета вы можете клонировать его, указав несуществующую папку (вне любого git-репо):
git clone /tmp/foo-all newFolder
git bundle
правильный ответ на мой взгляд, а не принятый. Я думаю, что он хорошо знает команду клонирования, если он может задать такой вопрос, и ему явно недостаточно (потому что это клон, а не дамп). Дампы - это разные вещи, такие как простые копии, например: 1) они не нужны для того, чтобы быть оптимальными (или даже способными) для нормальной работы 2) но они должны обладать хорошей устойчивостью и устойчивостью к повреждению данных 3) это часто полезно если они легко различимы для инкрементных резервных копий, тогда как это не является целью для копий.
git bundle
или git clone
получает все , например сценарии крючка.
git bundle
против удаленного репо?
Развивая некоторые другие ответы, это то, что я делаю:
Настройте репо: git clone --mirror user@server:/url-to-repo.git
Затем, когда вы хотите обновить резервную копию: git remote update
из местоположения клона.
Это создает резервные копии всех веток и тегов, в том числе новых, которые добавляются позже, хотя стоит отметить, что удаляемые ветви не удаляются из клона (что для резервной копии может быть полезным).
Это атомарно, поэтому не имеет проблем, которые могут возникнуть у простой копии.
Расширяя великолепные ответы KingCrunch и VonC
Я объединил их обоих:
git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all
После этого у вас есть файл, reponame.bundle
который можно легко скопировать. Затем вы можете создать новый нормальный git-репозиторий, используя это git clone reponame.bundle reponame
.
Обратите внимание, что git bundle
копируются только коммиты, которые приводят к некоторой ссылке (ветви или тегу) в хранилище. Таким образом, запутанные коммиты не сохраняются в связке.
git bundle create reponame.bundle --all
?
Все содержится в .git
каталоге. Просто сохраните это вместе с вашим проектом, как любой файл.
copy
или, cp
и это не соответствует его потребностям. И я также думаю, что он думает о пустом хранилище (хотя его также можно скопировать, я думаю, что это не полнофункциональная резервная копия).
использовать git bundle или клонировать
копирование каталога git не является хорошим решением, поскольку оно не является атомарным. Если у вас большой репозиторий, копирование которого занимает много времени, и кто-то отправляет его в ваш репозиторий, это повлияет на резервное копирование. Клонирование или создание пакета не будет иметь этой проблемы.
Вы можете сделать резервную копию git-репозитория с помощью git-copy с минимальным объемом хранилища.
git copy /path/to/project /backup/project.repo.backup
Затем вы можете восстановить свой проект с git clone
git clone /backup/project.repo.backup project
git clone --bare
+ git push --force
.
Правильный ответ IMO - git clone --mirror . Это полностью сделает резервную копию вашего репо.
Git clone mirror клонирует весь репозиторий, заметки, заголовки, ссылки и т. Д. И обычно используется для копирования всего репозитория на новый git-сервер. Это уничтожит все ветки и все, весь репозиторий.
git clone --mirror git@example.com/your-repo.git
Обычно клонирование репо не включает все ветви, только Мастер.
Копирование папки репо будет «копировать» только те ветки, которые были извлечены ... поэтому по умолчанию это только основная ветка или другие ветви, которые вы извлекли ранее.
Команда Git bundle также не то, что вам нужно: «Команда bundle упакует все, что обычно передается по проводам, с помощью команды git push в двоичный файл, который вы можете отправить кому-либо по электронной почте или поместить на флэш-диск, а затем распутать в другое хранилище. " (В чем разница между git clone --mirror и git clone --bare )
Этот поток был очень полезен, чтобы получить некоторое представление о том, как можно создавать резервные копии git-репозиториев. Я думаю, что все еще не хватает некоторых подсказок, информации или заключения, чтобы найти «правильный путь» (тм) для себя. Поэтому делюсь своими мыслями здесь, чтобы помочь другим, и выставлять их на обсуждение, чтобы улучшить их. Спасибо.
Итак, начнем с подбора исходного вопроса:
Затем обогатить его типичными пожеланиями и указать некоторые предварительные настройки:
Точка зрения отличается от того, что такое «100%» резервное копирование. Вот два типичных.
git - инструмент для разработчиков и поддерживает эту точку зрения через git clone --mirror
и git bundle --all
.
git gc
)git - инструмент для разработчиков, и оставляет это администратору. Резервное копирование конфигурации git и конфигурации ОС следует рассматривать как отдельное от резервного копирования содержимого.
Большинство из них являются общими для резервных копий.
git gc --auto
git bundle --all
git bundle verify
.git clone --mirror
git fsck
.Резервное копирование в режиме холодного копирования всегда может сделать полное резервное копирование файла: запретить все обращения к репозиториям git, сделать резервное копирование и разрешить доступ снова.
Резервное копирование файлов не может быть выполнено с активными репозиториями из-за риска повреждения данных при текущих фиксациях. Оперативное копирование обеспечивает фиксированное состояние активного хранилища для целей резервного копирования. Текущие коммиты не влияют на эту копию. Как указано выше, git поддерживает функции клонирования и связки, но для резервного копирования «100% admin» необходимо выполнить несколько действий с помощью дополнительных команд.
git bundle --all
для создания полных / инкрементных файлов дампа содержимого и копирования / резервного копирования файлов конфигурации отдельно.git clone --mirror
, обрабатывать и копировать конфигурацию отдельно, затем выполнить полное резервное копирование файла зеркала.
cd /path/to/backupdir/
git clone /path/to/repo
cd /path/to/repo
git remote add backup /path/to/backupdir
git push --set-upstream backup master
это создает резервную копию и выполняет настройку, так что вы можете сделать git push, чтобы обновить резервную копию, что, вероятно, вы и хотите сделать. Просто убедитесь, что / path / to / backupdir и / path / to / repo - это как минимум разные жесткие диски, в противном случае это не имеет особого смысла.
Вот два варианта:
Вы можете напрямую взять tar из каталога git repo, поскольку он содержит все содержимое репо на сервере. Существует небольшая вероятность того, что кто-то может работать над репо во время резервного копирования.
Следующая команда даст вам чистый клон репо (точно так же, как он находится на сервере), затем вы можете взять tar из того места, где вы клонировали, без каких-либо проблем.
git clone --bare {your backup local repo} {new location where you want to clone}
Насколько я знаю, вы можете просто сделать копию каталога, в котором находится ваш репо, и все!
cp -r project project-backup
git clone --bare
даст вам непротиворечивый снимок.