Я - сольный разработчик, работающий в локальном репозитории Мерзавца. Для резервных копий я хочу отослать точную копию того репозитория к другому серверу.
Действительно ли достаточно сделать это?
git push --mirror
Я спрашиваю, потому что я могу иногда выполнять эту команду два или три раза, прежде чем Мерзавец скажет мне "Все актуальное", так по-видимому, это не точное зеркало. Это, кажется, повторно продвигает ответвления отслеживания...?
$ 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
архивы, потому что я хотел бы, чтобы резервное копирование было доступной рабочей копией. Так как мой сервер резервного копирования подключен к сети и всегда на, это - хороший способ получить доступ к репозиторию, когда я нахожусь на дороге.
Я бы сказал, что это вполне приемлемая стратегия резервного копирования вашего репозитория. Он должен выполнять отправку на ваш исходный пульт для каждой ссылки в репозитории. Сделайте его полным «зеркалом» вашего локального репозитория.
РЕДАКТИРОВАТЬ: Я только что видел ваше обновленное описание в вопросе. Кажется, что git подталкивает ваш удаленный ref к самому пульту вместе со всем остальным. После завершения отправки удаленная ссылка будет обновлена, чтобы отразить то, что вы только что отправили на нее. Теперь это будет устаревшим для удаленного репозитория, поэтому необходимо дальнейшее продвижение. Если это вас не устраивает. Вы можете удалить эту удаленную ссылку с помощью
git push: origin / mybranch
, а затем использовать
git push --all
, помните, что при этом не будут выталкиваться какие-либо новые ветки, которые вы создаете.
В том же духе, что и ответ Amber, вы можете:
git bundle
Причина, по которой вы видите, что что-то перемещается во второй раз, заключается в том, что - mirror
подталкивает немного больше, чем вы ожидаете. Помимо ваших локальных веток, он также подталкивает ваши удаленные ветки, потому что зеркало подразумевает все . Поэтому, когда вы нажимаете в обычном режиме (или с помощью - mirror
), mybranch
нажимается, а origin / mybranch
обновляется, чтобы отразить новый статус в origin. Когда вы нажимаете с помощью - mirror
, также нажимается origin / mybranch
.
Это приводит к странности, которую вы видите, а также к еще большей странности, когда вы тянете от этого пульта дистанционного управления; вы получите ветки с именем origin / origin / mybranch
и т. д. Поэтому обычно лучше использовать - mirror
для одноразовых копий и просто использовать обычную отправку (возможно, с - -all
) для обычного использования.
Чтобы всегда отправлять все ветки и теги, вы можете обновить .git / config
следующим образом:
[remote "origin"]
url = ...
fetch = ...
push = +refs/heads/*
push = +refs/tags/*
Это сделает обычное нажатие, похожее на зеркало, за исключением того, что оно не удалит ветки, которые не существуют в источнике или для обновлений без перемотки вперед.
К сожалению, вы не можете получить точную копию с толкать. Вы теряете свой тайник .
Почему бы просто не сжать копию .git
и отправить ее на другой сервер?
Обычно я использую git push --all
. Я использую --mirror только тогда, когда мне нужно подтолкнуть вновь созданные ветки или я удалил некоторые ветки и не хочу называть их одну за другой. В противном случае push --all
обычно работает так, как мне нужно.