2010-07-26 3 views
42

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

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

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

+2

Смотри также: [Резервное копирование Git Repository Local] (http://stackoverflow.com/questions/2129214/backup-a-local-git-repository) – miku

+0

ли это резервное копирование reflog а ? Если нет, то это довольно плохая резервная копия. – onionjake

ответ

6

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

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

мерзавца толчке: происхождение/mybranch

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

GIT толчок --all

помните, что это вон» t нажимайте любые новые ветви, которые вы создаете.

+0

Тогда почему он что-то делает, когда я запускаю его во второй раз? – Thomas

+0

Что значит «что-то»? Является ли хранилище, которое вы нажимаете на голый клон? Можете ли вы предоставить более подробную информацию, так как я уверен, что git push -mirror должен обеспечить функциональность, которую вы ищете. –

+5

Также стоит знать, клонирует репозиторий, используя опцию -mirror, затем используя 'git remote add --mirror '. Это автоматически отразится, поэтому вы должны просто запустить «git push». –

0

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

+0

См. Мое редактирование. :) – Thomas

0

В том же духе, чем Amber's answer, вы можете:

  • толчок к локальной резервной копии created with git bundle
  • скопировать этот уникальный файл на удаленный сервер.
+0

Смотрите мое редактирование. :) – Thomas

3

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

28

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

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

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

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

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

+0

Спасибо, это приятно знать. Напомню, что я видел эти ветви 'origin/origin/*' в какой-то момент, но, видимо, я их удалил. Проблема с '--all' заключается в том, что он не будет выталкивать новые ветви и не удалит удаленные ветки. Это не достаточно глупо, и иногда я могу быть дураком. Невозможно сказать '--mirror' игнорировать удаленные ветви? – Thomas

+0

Я не думаю, что есть способ заставить его игнорировать пульты. Вы могли бы, однако, изменить yout '.git/config', чтобы нажимать больше по умолчанию. Я обновил ответ. –

19

К сожалению, вы не получаете точную копию с нажатием. Вы lose your stash.

+3

Спасибо, это приятно знать. Однако это не имеет большого значения, потому что в любом случае кошелек должен быть действительно кратковременным. – Thomas

+2

Да, я думаю, что он достаточно хорош для резервного копирования, но не идеален для синхронизации. Кроме того, мы все знаем, как долго мы иногда зависим от предположительно краткосрочных вещей. ;) – nschum

+4

Если вы сохраняете приступы на любое количество времени, возможно, вам нужно будет более комфортно делать ветки (: – Jacob

3

Что я делаю:

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

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

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

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

Смежные вопросы