Достаточно ли "git push --mirror" для резервного копирования моего хранилища? - PullRequest
50 голосов
/ 26 июля 2010

Я сольный разработчик, работаю в локальном репозитории 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 архивов, потому что я хотел бы, чтобы резервная копия была доступной рабочей копией. Поскольку мой сервер резервного копирования подключен к сети и всегда включен, это хороший способ получить доступ к хранилищу, когда я в дороге.

Ответы [ 7 ]

30 голосов
/ 27 июля 2010

Причина, по которой вы видите, что что-то толкнуло во второй раз, заключается в том, что --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/*

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

22 голосов
/ 27 июля 2010

К сожалению, вы не получите точную копию с помощью push. Вы теряете тайник .

7 голосов
/ 26 июля 2010

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

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

git push: origin / mybranch

и затем использовать

git push --all

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

4 голосов
/ 29 мая 2014

Что я делаю, это:

Настройка репо: git clone --mirror user@server:/url-to-repo.git

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

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

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

4 голосов
/ 26 июля 2010

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

1 голос
/ 26 июля 2010

В том же духе, что и Ответ Амбер , вы могли бы:

0 голосов
/ 26 июля 2010

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

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