Мне нужно сделать статистику по размеру нескольких git коммитов в репозитории с включенной git -lfs. Это не тривиальная задача из-за природы git, но нам нужно понять, какую полосу пропускания мы используем при типичном коммите.
Репозиторий, над которым я работаю, предназначен для Unreal Engine 4 Проект, в котором очень мало «текстовых» файлов, поэтому я могу выдвинуть гипотезу, что размер коммита равен размеру данных git -lfs, отправленных . Я не думаю, что мне никогда не понадобится ослаблять эту гипотезу (или даже, я могу ослабить ее). Кроме того, репозиторий относительно новый , таким образом, число ветвей и фиксаций на ветку оба ограничены.
Я не могу найти официальное решение для инструментов Git -LFS, таким образом, на данный момент я использую этот скрипт dirty python в локальном клоне хранилища:
import shlex
import os
from subprocess import check_output
# Run shell script and return stdout
def run(command):
return check_output(shlex.split(command)).decode()
# Get the list of all the sha of the current branch:
# for each commit:
# get a list of the files in the commit
# if the file is a uasset
# read file (git-lfs file pointer) and extract size
# sum up current size to the total size of the commit
sha_list = run(u"""git log --pretty=oneline""").split(os.linesep)[:-1]
sha_list = [sha.split()[0] for sha in sha_list][0:8] # WHOOOOPS!
result = {}
for sha in sha_list:
result[sha] = 0
file_list = run(u"""git show --pretty="" --name-only {}""".format(sha)).split(os.linesep)[:-1]
try:
for file in file_list:
if file.endswith("uasset"):
git_lfs_msg = run(u"""git show {}:{}""".format(sha, file)).split(os.linesep)[:-1]
size_msg = git_lfs_msg[2].split()[1]
result[sha] += int(size_msg)
except:
pass
for sha, size in result.items():
print("{} :: {:.3f} MB".format(sha, float(size)/(1024*1024)))
Этот простой скрипт почти работает, но подразумевает несколько недостатков:
- , если я запрашиваю историю слишком долго, она блокируется после некоторых коммитов (в моем случае 8, cfr. whoops line).
- при возвращении в историю скрипт выдает ошибку о несуществующем файле (
git show $sha:$file
выходит != 0
: возможно, работает только с текущим существующим файлом моей проверки?). Эта ошибка объясняет наличие блока try/except
. - (подключено к предыдущему). Я должен вручную проверять каждую ветвь репозитория, чтобы иметь хорошую статистику
Я пытался найти решение в Интернете, но не нашел ни одного для репозитория с Git -LFS активен. Знаете ли вы о лучшем подходе к решению этой проблемы?