Является ли "git push -mirror" достаточным для резервного копирования моего репозитория?

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

Достаточно ли этого сделать?

git push --mirror

Я спрашиваю, потому что иногда я могу запустить эту команду два или три раза, прежде чем Git сообщит мне "Все актуально", поэтому, по-видимому, это не точное зеркало. Кажется, это повторное нажатие ветвей отслеживания...?

$ git push --mirror
Counting objects: 42, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (30/30), done.
Writing objects: 100% (30/30), 5.09 KiB, done.
Total 30 (delta 17), reused 0 (delta 0)
To ssh://my/repo/url
   c094a10..0eedc92  mybranch -> mybranch
$ git push --mirror
Total 0 (delta 0), reused 0 (delta 0)
To ssh://my/repo/url
   c094a10..0eedc92  origin/mybranch -> origin/mybranch
$ git push --mirror
Everything up-to-date

Что происходит, и это хорошая стратегия?

Изменить: мне не нравится использовать что-то вроде архива git bundle или .tar.bz2, потому что я хочу, чтобы резервная копия была доступной рабочей копией. Поскольку мой резервный сервер подключен к сети и всегда включен, это хороший способ получить доступ к репозиторию, когда я нахожусь в дороге.

Ответ 1

Я бы сказал, что это вполне приемлемая стратегия для резервного копирования вашего репозитория. Он должен выполнить push на ваш источник remote для каждого ref в репозитории. Сделать это "зеркалом" вашего локального репозитория.

EDIT: Я только что просмотрел ваше обновленное описание в вопросе. Кажется, что git подталкивает ваш удаленный ретранслятор к самому удаленному устройству вместе со всем остальным. После того, как нажатие закончится, удаленный ref будет обновлен, чтобы отразить то, что вы только что нажали. Теперь это будет устаревать с удаленным репозиторием, поэтому необходим дополнительный толчок. Если это вас не удовлетворяет. Вы можете удалить этот удаленный ref с помощью

git push: origin/mybranch

а затем используйте

git push --all

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

Ответ 2

Причина, по которой вы видите, что что-то втолкнуло во второй раз, заключается в том, что --mirror нажимает немного больше, чем вы ожидаете. Помимо ваших локальных веток, он также подталкивает ваши удаленные ветки, потому что зеркало подразумевает все. Поэтому, когда вы нажимаете обычно (или с помощью --mirror), mybranch нажата и origin/mybranch обновляется, чтобы отразить новый статус по происхождению. Когда вы нажимаете с помощью --mirror, origin/mybranch также нажата.

Это приводит к странности, которую вы видите, а также к худшей странности, когда вы тянете с этого пульта; вы получили бы ветки с именем origin/origin/mybranch и т.д. Поэтому обычно рекомендуется использовать --mirror для однократных копий и просто использовать обычный push (возможно, с --all) для обычных целей.

Чтобы всегда нажимать все ветки и теги, вы можете обновить .git/config так:

[remote "origin"]
  url = ...
  fetch = ...
  push = +refs/heads/*
  push = +refs/tags/*

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

Ответ 4

Обычно я использую git push --all. Я использую только -mirror, когда мне нужно нажимать вновь созданные ветки, или я удалил несколько ветвей и не хочу их называть по одному. В противном случае push --all обычно работает так, как мне нужно.

Ответ 5

Что я делаю:

Настройка репо: git clone --mirror [email protected]:/url-to-repo.git

Затем, когда вы хотите обновить резервную копию: git remote update из места клонирования.

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

Из http://www.garron.me/en/bits/backup-git-bare-repo.html

Ответ 6

Почему бы просто не сжать копию папки .git и отправить ее на другой сервер?