Совокупный размер помещенных активов UE4 с Git LFS - PullRequest
0 голосов
/ 03 февраля 2020

Мне нужно сделать статистику по размеру нескольких 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 активен. Знаете ли вы о лучшем подходе к решению этой проблемы?

...