Резервное копирование git-репозиториев с использованием fetch вместо push - PullRequest
4 голосов
/ 25 ноября 2010

Если ваша версия git слишком старая, чтобы поддерживать git push --mirror с вашего сервера gitolite, возможно ли имитировать эту функцию, сначала git clone --bare добавив новые репозитории, а затем используя git fetch refs/*:refs/* на сервере резервного копирования? Можете ли вы указать *:* в качестве refspec? Поскольку репозитории на сервере gitolite являются открытыми репозиториями, не имеет значения, если команде fetch не удается выбрать объекты, которые используются только при наличии рабочего каталога.

Моя стратегия восстановления состояла бы в том, чтобы, я надеюсь, просто скопировать содержимое $ BACKUPDIR сервера резервного копирования на новый сервер gitolite, если текущий взорвется. Будет ли это работать так, как ожидалось в этом сценарии?

1 Ответ

3 голосов
/ 25 ноября 2010

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

  1. Я не вижу смысла использовать git fetch вместо git push, когда вы действительно хотите смоделировать git push --mirror.

  2. Вы можете использовать *:* в качестве refspec (по крайней мере, в последних версиях git). Это отличается от :, так как последний выбирает только те ветви, которые существуют в обоих репозиториях, тогда как первый выбирает все ветви на отправляющем сайте и отправляет их на принимающий сайт, создавая там новые ветки, если это необходимо (это верно для обоих , fetch и push).

  3. Ближайшим приближением git push --mirror $REMOTE в одной команде может быть

    git push -f $REMOTE *:*
    

    Отличие от "реальной вещи" заключается в том, что она никогда не удаляет ветви на удаленном конце. Вы можете либо проигнорировать это - в любом случае это может быть вполне разумным резервным копированием - либо вы можете взломать некоторый код, чтобы удалить их вручную. Вот моя (действительно плохая) попытка сделать это:

    git ls-remote $REMOTE refs/* | cut -f 2 > remote-branches
    git show-ref | cut -d " " -f 2 > local-branches
    git push --delete $(join -v 1 remote-branches local-branches)
    

    Я думаю, что эта попытка в корне ошибочна - используйте на свой страх и риск. И это может не работать для старых версий git в любом случае. (Я был удивлен, git show-ref использует пробелы в качестве разделителя полей, в то время как git ls-remote использует вкладки для того же вида вывода.)

...