На самом деле, 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
для создания пакета, содержащего только дельты с момента последнего резервного копирования.