Дата и время публикации:
Проблема и решение
1. Cуть проблемы
При попытке сохранения Git-репозитария firmware/linux-firmware.git в локальном хранилище git.server.local, как показано в дампе 1.1
Дамп 1.1
LANG=C git push --all new-origin Enumerating objects: 15054, done. Counting objects: 100% (15054/15054), done. Delta compression using up to 4 threads Compressing objects: 100% (5201/5201), done. remote: error: object 087fbb748f50af6eac2248a445d25d666cc92c78: zeroPaddedFilemode: contains zero-padded file modes remote: fatal: fsck error in packed object error: remote unpack failed: index-pack abnormal exit To git.server.local:firmware/linux-firmware.git ! [remote rejected] main -> main (unpacker error) error: failed to push some refs to 'git.server.local:firmware/linux-firmware.git'
Был выявлен объект 087fbb748f50af6eac2248a445d25d666cc92c78 содержащий объекты в режиме дополнения файлов нулями (zero-padded file modes), который приводил к ошибки сохранения Git-репозитария firmware/linux-firmware.git в локальном хранилище [3.2].
2. Решение
2.1 Получение всех объектов и метаданных репозитария firmware/linux-firmware.git
Производится серией запросов Git, как показано в дампе 2.1.1
Дамп 2.1.1
git init firmware/linux-firmware.git && cd firmware/linux-firmware.git git remote add origin git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git git fetch --all --prune git fetch --tags
2.2 Исправление объектов в режиме дополнения файлов нулями
Выполнить запрос git fsck на наличие ошибок в репозитарии firmware/linux-firmware.git, как показано в дампе 2.2.1
Дамп 2.2.1
git fsck Проверка каталогов объектов: 100% (256/256), готово. warning in tree ff42cbe9e62d5d3e383ca621028bd6554597d5f0: zeroPaddedFilemode: contains zero-padded file modes warning in tree a1b6cee91e8ec2d6234662bae82e7311ddebcae4: zeroPaddedFilemode: contains zero-padded file modes warning in tree f33530989ecad99fac4a5e9fa26fa80d01846594: zeroPaddedFilemode: contains zero-padded file modes warning in tree 490909e4f0eccf5d3734b8800c52d6dbe967928e: zeroPaddedFilemode: contains zero-padded file modes warning in tree 09de674843f61f482d93cd37cb93744c6f041051: zeroPaddedFilemode: contains zero-padded file modes warning in tree 1d5d6b2f3fb29d29c2f1befa2bbfa04480f4116c: zeroPaddedFilemode: contains zero-padded file modes warning in tree 9e915799fa70510fa6248a5e36440c007efe7edd: zeroPaddedFilemode: contains zero-padded file modes … warning in tree d796cc08fdcd4c2dc746851b40d6f8e8d14a97b9: zeroPaddedFilemode: contains zero-padded file modes Проверка объектов: 100% (15091/15091), готово.
Которая выявила множество объектов в режиме дополнения файлов нулями.
Оставаясь в исходном репозитарии, создать новый — куда будет помещена восстановленная копия, как показано в дампе 2.2.2
Дамп 2.2.2
git init ../linux-firmware-repaired.git
выполнить запрос git fast-export, как показано в дампе 2.2.3
Дамп 2.2.3
git fast-export --all | (cd ~/repaired_repo && git fast-import) fatal: encountered signed tag 26e4a349e734d60f6e9f365708db06a11a53e77c; use --signed-tags=to handle it fast-import statistics: --------------------------------------------------------------------- Alloc'd objects: 20000 Total objects: 15054 ( 586 duplicates ) blobs : 7550 ( 0 duplicates 3867 deltas of 7422 attempts) trees : 4917 ( 586 duplicates 4475 deltas of 4621 attempts) commits: 2587 ( 0 duplicates 0 deltas of 0 attempts) tags : 0 ( 0 duplicates 0 deltas of 0 attempts) Total branches: 38 ( 39 loads ) marks: 1048576 ( 10137 unique ) atoms: 2881 Memory total: 3829 KiB pools: 2423 KiB objects: 1406 KiB --------------------------------------------------------------------- pack_report: getpagesize() = 4096 pack_report: core.packedGitWindowSize = 2146435072 pack_report: core.packedGitLimit = 2146435072 pack_report: pack_used_ctr = 2649 pack_report: pack_mmap_calls = 1212 pack_report: pack_open_windows = 1 / 1 pack_report: pack_mapped = 864753226 / 864753226 ---------------------------------------------------------------------
Если во время восстановления случилась ошибка осталось выполнить повторно с указанием метода переноса подписанных GPG тэгов, как показано в дампе 2.2.4
Дамп 2.2.4
git fast-export --signed-tags=strip --all | (cd ../linux-firmware-repaired.git && git fast-import) Распаковка объектов: 100% (37/37), 5.20 КиБ | 532.00 КиБ/с, готово. fast-import statistics: --------------------------------------------------------------------- Alloc'd objects: 20000 Total objects: 37 ( 15640 duplicates ) blobs : 0 ( 7550 duplicates 0 deltas of 0 attempts) trees : 0 ( 5503 duplicates 0 deltas of 0 attempts) commits: 0 ( 2587 duplicates 0 deltas of 0 attempts) tags : 37 ( 0 duplicates 0 deltas of 0 attempts) Total branches: 38 ( 311 loads ) marks: 1048576 ( 10137 unique ) atoms: 2881 Memory total: 3829 KiB pools: 2423 KiB objects: 1406 KiB --------------------------------------------------------------------- pack_report: getpagesize() = 4096 pack_report: core.packedGitWindowSize = 2146435072 pack_report: core.packedGitLimit = 2146435072 pack_report: pack_used_ctr = 2679 pack_report: pack_mmap_calls = 1 pack_report: pack_open_windows = 1 / 1 pack_report: pack_mapped = 864753226 / 864753226 ---------------------------------------------------------------------
После чего, нужно настроить URL удаленного хранилища linux-firmware-repaired.git в хранилище реозитариев, как показано в дампе 2.2.5
Дамп 2.2.5
git remote add origin git@git.server.local:firmware/linux-firmware.git git remote -v origin git@git.server.local:firmware/linux-firmware.git (fetch) origin git@git.server.local:firmware/linux-firmware.git (push)
Выполнить сохранение объектов, как показано в дампе 2.2.6
Дамп 2.2.6
LANG=C git push --all origin Enumerating objects: 15054, done. Counting objects: 100% (15054/15054), done. Delta compression using up to 4 threads Compressing objects: 100% (6290/6290), done. Writing objects: 100% (15054/15054), 824.69 MiB | 76.89 MiB/s, done. Total 15054 (delta 8342), reused 15054 (delta 8342), pack-reused 0 remote: Определение изменений: 100% (8342/8342), готово. To git.server.local:firmware/linux-firmware.git * [new branch] main -> main
и туда же тэги, как показано в дампе 2.2.7
Дамп 2.2.7
LANG=C git push --tags Enumerating objects: 37, done. Counting objects: 100% (37/37), done. Delta compression using up to 4 threads Compressing objects: 100% (37/37), done. Writing objects: 100% (37/37), 5.22 KiB | 5.22 MiB/s, done. Total 37 (delta 0), reused 0 (delta 0), pack-reused 0 To git.server.local:firmware/linux-firmware.git * [new tag] 20190312 -> 20190312 * [new tag] 20190416 -> 20190416 * [new tag] 20190514 -> 20190514 ...
Библиография
3.1 Push to gitlab.com fails with zeroPaddedFilemode: contains zero-padded file modes
3.2 remote: fatal: fsck error in packed object when pushing oh-my-zsh repo to new remote