Почему размер репозитория удваивается, когда я копирую заметки?
Я импортирую SVN-репозиторий, используя Subgit, который является отличным инструментом, который делает это быстро и поддерживает пользовательскую компоновку SVN. Subgit сохраняет git commit -> ссылку на ревизию SVN в git notes
, Каждый коммит имеет номер ревизии в примечаниях, вы можете увидеть его с git log
,
После импорта SVN->git я использую очиститель репозитория BFG для очистки старого репозитория проекта от двоичных файлов, таких как jars, dll и т. Д.
BFG не переписывает ссылки между git notes и измененными коммитами, но, к счастью, оставляет 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 Мб:/ 80 после очистки BFG и 86 после копирования заметок
1 ответ
Три эволюции в Git (с 2017 года) и инструменты вокруг Git должны помочь с этой проблемой:
- Первый: такой инструмент, как github/git-sizer , даст вам представление о том, что занимает так много места.
- Два:
git filter-repo
(о котором я упоминал здесь ) теперь заменяет BFG или gilter-branch. Сначала установите его . (python3 -m pip install --user git-filter-repo
).
Это оставит меньше данных после очистки банок/двоичных файлов, которые вам не нужны.
git filter-repo --strip-blobs-bigger-than 10M
- Третье: объекты, которые потеряли ссылки, могут быть удалены, даже если к ним прикреплены заметки (и эти заметки станут оборванными, что, в свою очередь, можно удалить с помощью "
git notes prune
" ( man)).
Это было разъяснено в документации с Git 2.31 (Q1 2021), .
См. (10 февраля 2021 г.) Мартина фон Цвайгбергка (
martinvonz
) .
(Объединено Junio C Hamano --
gitster
-- в коммите d590ae5, 25 февраля 2021 г.)
коммит fa9ab02
docs
: уточнить, что refs/notes/ не поддерживает прикрепленные объектыПодписал: Мартин фон Цвайгбергк
git help
( man) gc содержит этот фрагмент:"[...] it will keep [..] objects referenced by the index, remote-tracking branches, notes saved by git notes under refs/notes/"
Я интерпретировал это как утверждение, что объекты, к которым были прикреплены заметки, сохраняются, но это не так.
Давайте уточним документацию, убрав часть о ( человек ) в отдельное предложение.
git gc
теперь включает в свою справочную страницу :
объекты, на которые ссылается индекс, ветки удаленного отслеживания, журналы ссылок (которые могут ссылаться на коммиты в ветках, которые позже были изменены или перемотаны) и все остальное в
refs/*
пространство имен.Обратите внимание, что заметка (типа созданной '
git notes
'), прикрепленный к объекту, не способствует сохранению объекта в живых.
Если вы ожидаете, что некоторые объекты будут удалены, но это не так, проверьте все эти местоположения и решите, имеет ли смысл в вашем случае удалять эти ссылки.