Почему размер репозитория удваивается, когда я копирую заметки?

Я импортирую 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 г.)

коммит fa9ab02docs: уточнить, что 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'), прикрепленный к объекту, не способствует сохранению объекта в живых.
Если вы ожидаете, что некоторые объекты будут удалены, но это не так, проверьте все эти местоположения и решите, имеет ли смысл в вашем случае удалять эти ссылки.

Другие вопросы по тегам