Я импортирую репозиторий SVN с помощью Subgit, который является отличным инструментом, который делает это быстро и поддерживает пользовательский макет svn. Subgit сохраняет git commit -> ссылку на версию svn в git notes
. Каждый коммит имеет номер ревизии в примечаниях, вы можете увидеть его с помощью git log
.
После импорта SVN-> git я использую очиститель репозитория BFG для очистки старого репозитория проекта от двоичных файлов, таких как jar, dll и т. д. BFG не перезаписывает ссылки между заметками git и измененными коммитами, но, к счастью, оставляет object-id-map.old-new.txt
файла.
Я использую этот файл для копирования заметок из старых коммитов в новые:
cat object-id-map.old-new.txt | git notes copy --stdin
После копирования заметок я удаляю их из старых объектов:
cat object-id-map.old-new.txt | cut -d' ' -f 1 | git notes remove --stdin --ignore-missing
Проблема в том, что после исправления git notes размер репозитория становится в 2 раза больше (даже если я клонирую без --bare
). Почему?
Пример: я импортировал репозиторий из svn с помощью Subgit и имею 400 МБ .git
. Затем я применяю BFG и получаю голый репозиторий на 40 Мб. Я хочу восстановить заметки git, перемещая (копируя и удаляя) их с помощью двух команд выше, но, к сожалению, размер репо увеличивается с 40 МБ до 80 МБ. Я пытаюсь выполнить git notes prune
и git reflog expire --expire=now --all && git gc --prune=now --aggressive
, которые рекомендует BFG, но все еще есть 80 Мб.
UPD: сейчас не могу воспроизвести репозиторий размером 40 Мб:/ После очистки BFG 80 и 86 после копирования заметок
git log refs/notes/commits
. - person user4003407   schedule 05.05.2017git -c gc.autoDetach=0 -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc --prune --aggressive
иgit -c gc.autoDetach=0 -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now prune
- person Dmitry Pavlenko   schedule 06.05.2017