Локальный извлеченный репозиторий git должен быть отражен на резервную машину, то есть каталог .git
и рабочее дерево.На этой резервной машине будет сделана файловая система снимков , чтобы обеспечить простое и мгновенное восстановление после произвольных неудач git [1].
Очевидным решением является использование rsync
и все готово, но при регулярном запуске git gc создаются новые и разные большие .pack файлы, которые плохо воспроизводятся со снимками [2].Эта опция gc не может быть легко изменена для исходного репозитория.Также это будет означать, что rsync
обходит все в подпапке .git/objects
, замедляя его.
Было бы более элегантно использовать git
напрямую (и просто перенести все уже переданные работы в пустой репозиторий).было бы легко), но это оставляет рабочее дерево.Серверная конфигурация репо receive.denyCurrentBranch = updateInstead
не будет работать, потому что рабочее дерево может быть не чистым.
Будет что-то вроде git push
'ing, а затем rsync
' с рабочим деревом плюс все в .git
минус работа подпапки objects
?В идеале, даже повторяющаяся перебазировка, слияние или выбор вишни будут воспроизведены.Я думал о серверных хуках [3] на post-receive
, но они никогда не видят состояние рабочего дерева клиента.
1: Для вещей, где даже git reflog не помогает, таких как умирающий компьютер или .git
быть испорченным или просто ленивым пользователем.
2: Например, три ~ 10 строк коммитов и запуск gc привели к ок.Передается 500 МБ файлов.
3: перехватчики на стороне сервера означают, что репо нельзя восстановить с помощью простого scp -r
, но это приемлемо.
ОБНОВЛЕНИЕ:
Кажется невозможным, как, например, jwz, уже обнаруженный в 2015 году [j], обходные пути:
[..], было 3½ предложений здесь:
Полностью отключите файлы пакета и gc, что приведет к накоплению небольших файлов при каждом будущем изменении и в конечном итоге приведет к замедлению работы.gc.auto 0, gc.autopacklimit 0.
Установите максимальный размер пакета на меньшее число, чтобы ни один файл пакета не становился слишком большим, а последующие слои различий объединялись в меньшиеупаковать файлы.pack.packSizeLimit.
Особое мнение по поводу # 2: это не делает то, что вы думаете, а просто разбивает один большой файл пакета на N различных файлов с одинаковыми битами вих, поэтому вы ничего не сохранили.
Если у вас уже есть один гигантский файл пакета, создайте рядом с ним файл .keep.Появятся новые файлы пакета, но они будут отличаться от сохраненного и, следовательно, меньше.
j: https://www.jwz.org/blog/2015/05/git-and-backups/