Запретить добавление большого текстового файла для фиксации при использовании GitHub - PullRequest
0 голосов
/ 09 декабря 2018

Мы хотим предотвратить:

  • Передача очень больших текстовых файлов (> 50 МБ на файл) в git вместо git-lfs, поскольку они раздувают историю git.
  • Проблема в том, что 99% из них составляют <1 МБ и должны быть зафиксированы для лучшего сравнения. </li>
  • Причина различий в размере: это файлы YAML, они поддерживают двоичную сериализацию через кодировку base64.
  • Причина, по которой мы не можем надежно предотвратить двоичную сериализацию: это проект Unity, двоичная сериализация необходима по разным причинам.

Учитывая:

  • GitHub хостинготсутствие поддержки перехвата предварительного получения.
  • git-lfs отсутствие поддержки атрибутов размера файла.

Вопросы:

  1. Как мы можем надежно предотвратить большиедобавление файлов для фиксации?
  2. Можно ли это сделать через конфигурационный файл в репо, чтобы все пользователи соблюдали это правило изящно?
  3. Если нет, можно ли это сделать с помощью команды bash aliasing настолько довереннойпользователи могут видеть предупреждениекогда они случайно git add большой файл, и он не обрабатывается git-lfs?

(Наше окружение - macOS.Я рассмотрел множество решений, и пока ни одно из них не удовлетворяет нашим потребностям)

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Хорошо, с помощью подсказок от CodeWizard и этого SO ответа , мне удалось самостоятельно создать хорошее руководство:

Сначала настройте репо core.hooksPath с помощью:

git config core.hooksPath .githooks

Во-вторых, создайте этот pre-commit файл в папке .githooks, чтобы его можно было отслеживать ( gist link ), затем не забудьте дать ему разрешение на выполнение с помощью chmod +x.

#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".

# Redirect output to stderr.
exec 1>&2

FILE_SIZE_LIMIT_KB=1024
CURRENT_DIR="$(pwd)"
COLOR='\033[01;33m'
NOCOLOR='\033[0m'
HAS_ERROR=""
COUNTER=0

# generate file extension filter from gitattributes for git-lfs tracked files
filter=$(cat .gitattributes | grep filter=lfs | awk '{printf "-e .%s$ ", $1}')

# before git commit, check non git-lfs tracked files to limit size
files=$(git diff --cached --name-only | sort | uniq | grep -v $filter)
while read -r file; do
    if [ "$file" = "" ]; then
        continue
    fi
    file_path=$CURRENT_DIR/$file
    file_size=$(ls -l "$file_path" | awk '{print $5}')
    file_size_kb=$((file_size / 1024))
    if [ "$file_size_kb" -ge "$FILE_SIZE_LIMIT_KB" ]; then
        echo "${COLOR}${file}${NOCOLOR} has size ${file_size_kb}KB, over commit limit ${FILE_SIZE_LIMIT_KB}KB."
        HAS_ERROR="YES"
        ((COUNTER++))
    fi
done <<< "$files"

# exit with error if any non-lfs tracked files are over file size limit
if [ "$HAS_ERROR" != "" ]; then
    echo "$COUNTER files are larger than permitted, please fix them before commit" >&2
    exit 1
fi

exit 0

Теперь, при условии, что вы правильно настроили и .gitattributes, и git-lfs, эта ловушка перед фиксацией будет работать, когда вы попытаетесь git commit и убедитесь, что все подготовленные файлы не отслеживаются git-lfs (как указанов вашем .gitattributes), будет соответствовать указанному ограничению размера файла.

Любые новые пользователи вашего репо должны будут сами настроить core.hooksPath, но помимо этого все должно работать .

Надеюсь, это поможет другим разработчикам Unity бороться с растущим размером git-репо!

0 голосов
/ 09 декабря 2018
  • Как мы можем надежно предотвратить добавление больших файлов для фиксации?
  • Можно ли это сделать через файл конфигурации в репозитории, чтобы все пользователи следовали этому правилу изящно?Поскольку GitHub не поддерживает перехватчики на стороне сервера, вы можете использовать перехватчики на стороне клиента.Как вы, наверное, знаете, эти ловушки можно без проблем пропустить и отключить, но, тем не менее, это хороший способ сделать это.

core.hooksPath

Git v2.9 добавлена ​​возможность устанавливать клиентские перехваты в удаленной папке.До этого хуки должны быть помещены в папку .git.

Это позволит вам писать сценарии и размещать их где угодно.Я предполагаю, что вы знаете, что такое хуки, но если не можете спросить.


Как это сделать?

Обычно вы размещаете хуки в своем репо (или любой другой общей папке).).

# set the hooks path. for git config, the default location is --local
# so this configuration is locally per project
git config core.hooksPath .githooks
...