git - Как отменить "git repack -ad"? - PullRequest
3 голосов
/ 13 января 2010

У меня есть git-репозиторий, который я упаковал с git repack -a -d, он упаковал все объекты в один большой файл. Это экономит место. Однако я хочу отменить это и превратить один большой файл пакета во все маленькие объектные файлы.

Причина, по которой я хочу это сделать, - сделать резервную копию git-репозитория на удаленном сервере. Я сделал резервную копию (перед перепаковкой). Установка git на удаленном сервере нетривиальна, поэтому я собирался использовать rsync для копирования файлов. Однако rsync не такой умный и в основном захочет копировать вещи снова. Если я смогу «распаковать» этот репозиторий, это может ускорить его копирование.

Ответы [ 3 ]

5 голосов
/ 13 января 2010

git-unpack-objects будет распаковывать объекты, но только внутри репо, которое не содержит пакет:

Создать новый пустой репо:

mkdir new-repo; cd new-repo; git init

Запись объектов в:

git unpack-objects < ../old-repo/.git/objects/pack/pack-XXX.pack

Потяните необходимые ветки / метки в:

git pull ../old-repo

Или, если вы любите приключения, вы можете попытаться использовать каталог объектов в new-repo вместо старого.

4 голосов
/ 16 января 2010

На самом деле, git-unpack-objects будут отлично работать , если вы сначала переименуете или переместите файл пакета. Он предназначен для добавления входящего пакета в репозиторий, добавляя все объекты, которых там еще нет. Если переместить файл пакета на имя файла, где git не может его найти, все его объекты невозможно будет найти.

В основном:

mv .git/objects/pack .git/objects/pack.old
for i in .git/objects/pack.old/pack-*.pack; do
    git-unpack-objects < $i && rm $i ${i%pack}idx
done
rmdir .git/objects/pack.old

Однако имейте в виду, что файл пакета на намного меньше, чем свободные объекты (потому что свободные объекты не выполняют дельта-сжатие друг против друга), и хотя Линус изначально намеревался делать именно то, что вы Вы делаете (только свободные объекты и используете rsync), он быстро обнаружил, что это неработоспособно.

Правильный способ сделать это - один раз перепаковать (с агрессивными параметрами, чтобы минимизировать размер), а затем создать файл .keep (если $i равен pack-*.pack, вы хотите touch ${i%pack}keep). Это сделает созданный файл пакета «священным», и он никогда не будет удален или перепакован.

Затем вы можете использовать rsync в пакете "Остаток", пока он не станет достаточно большим, чтобы гарантировать объединение во второй .keep shunk.

Третий способ сделать это - использовать git-bundle для создания пакета, содержащего только дельты с момента последнего резервного копирования.

1 голос
/ 16 марта 2011

Вы можете попробовать сделать

fast-export | fast-import

в свежий репо. Скорее всего, упаковка не сработает. В противном случае вы можете настроить конфиг для пакета (man git config, поиск пакета. *)

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