Оцените размер репозитория Git перед его клонированием
Есть ли способ оценить размер публичного репозитория Git без его клонирования?
Я хотел бы использовать эту информацию, чтобы убедиться, что репозиторий меньше определенного размера. Если это не так, я не хочу клонировать его.
Я знаю, что это можно сделать в Github, но этот репозиторий размещается на выделенном сервере.
Ответы
Ответ 1
Короткий ответ: "нет"
Если пространство вообще вызывает беспокойство, клонируйте репо на свое самое большое доступное свободное пространство, и если он будет достаточно погружен в другие места, это будет дешево.
Действительно грубый способ получить это: положите это, например. ваш post-receive hook на сервере
git for-each-ref refs/size | while read . . ref; do git update-ref --delete $ref; done
set -- $(du -sh .git/objects)
git update-ref refs/size/$1-as-of-$(date +%Y%m%dT%H%M%S%Z) HEAD
и вы можете просто ls-remote для него.
Ответ 2
Короткий ответ: Nnn... может быть.
Длинный ответ: Есть несколько эвристик, и вы можете совать с помощью Git протоколы передачи, чтобы получить некоторую информацию.
Мое личное наблюдение заключается в том, что для большинства текстовых проектов размер .git редко превышает размер проверки даже для очень старых проектов.
Извлечение info/refs
расскажет вам, сколько тегов и ветвей находится в репозитории.
Извлечение objects/info/packs
расскажет вам, какие файлы packfiles у него есть. Затем вы можете выполнить запрос HEAD (при условии, что он HTTP) на objects/pack/pack-WHATEVERTHEIDIS.pack
, чтобы узнать, насколько велики файлы пакета. Это даст вам более низкую оценку размера репозитория.
Если дисковое пространство является проблемой (диск дешев, купите новый), вы можете сделать git clone --bare
, чтобы сэкономить вам пространство для проверки. Затем вы можете клонировать эту локальную, голую версию, чтобы получить полную проверку.
Наконец, если вы умны, вы можете пройти дерево объектов, выполняя запрос HEAD, чтобы получить размер каждого объекта и отменить объект GET после того, как вы получили только заголовок (игнорируя часть данных). Это даст вам размер репозитория без необходимости загружать весь репозиторий.