Как рассчитать размер git коммита времени жизни подпапки? Сколько подпапок занимает общий размер репозитория git? - PullRequest
1 голос
/ 09 апреля 2019

Мое репозиторий git выглядит следующим образом: foo (root) / src / test В foo, src и test есть две папки. Я могу рассчитать общий размер репо с помощью команды git gc, но я хочу знать, какой вклад / test вносит вобщий размер репо

1 Ответ

2 голосов
/ 09 апреля 2019

Может быть несколько разных подходов, но самый простой - переписать историю хранилища, чтобы там осталась только история /test.Затем мы можем рассчитать объем диска, взятого им.

Сначала клонируйте свой репозиторий в какое-нибудь место на вашем диске:

git clone <url> location1

cd location1

Теперь убедитесь, что все ваши ветви репозитория извлечены как локальные ветви, так что их история будет сохранена, когда мы будем переписывать репозиторий позже.Для этого получите список веток хранилища и проверьте каждую из них:

git for-each-ref --format="%(refname:lstrip=3)" refs/remotes/ | xargs -L1 git checkout

Суть решения - мы удаляем все остальные папки, кроме /test:

git filter-branch --subdirectory-filter test -- --all

На данный момент только содержимое каталога /test осталось в состоянии репо (и эта папка стала корнем проекта).Тем не менее, Git не удалил некоторые старые версии - все ваши несвязанные коммиты и файлы по-прежнему хранятся в локальном хранилище репозитория.Есть два альтернативных подхода к его очистке.

  1. Самый простой - клонировать репо на другое место на диске (таким образом, не будут клонированы несвязанные удаленные ссылки) и обрезать репо там:
cd ..
git clone location1 location2
cd location2
git gc --prune=now

2. Более хакерский, но все делает на месте (взято из этого ответа ):

git remote rm origin

rm -rf .git/refs/original/ .git/refs/remotes/ .git/*_HEAD .git/logs/

git for-each-ref --format="%(refname)" refs/original/ | xargs -n1 git update-ref -d

git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc

Любой из этих подходов очистит ваш репозиторий от всех объектов, не связанных с текущим состоянием репозитория.

Теперь мы готовы оценить размер истории папок /test:

du -h -s .git

Это дает представление о том, насколько папка и ее история влияют на размер хранилища.

Там может быть несколько других подходов.Например, вы можете попробовать то же самое с фильтрацией хранилища, но на этот раз удалите каталог /test и проверьте, насколько уменьшился размер репо.Или вы можете создать программу / скрипт, который бы проверял коммиты в журнале Git и следовал ссылкам на объекты, чтобы вычислить, сколько /test места занято его деревом и BLOB-объектами - но это потребовало бы гораздо большего количества кода,

Мне нравится это решение, потому что оно делается только через командную строку и дает ответ прямо в конце.

...