2016-09-19 5 views
6

Я полностью осведомлен о this question, который технически делает это дубликат, но ответы только предлагают решение на push, что было бы слишком поздно для моих требований.Как ограничить размер файла при фиксации?

Есть ли возможность ограничить размер файла при совершении?

Например: размер файлов выше 500 К будет выдавать предупреждение. Размер файлов выше 10M остановит фиксацию.

+0

Возможный дубликат [Предельный размер файла в git repository] (http://stackoverflow.com/questions/7147699/limiting-file-size-in-git-repository) – bbodenmiller

+0

@bbodenmiller Это не дубликат. Вы читали мой вопрос до конца? Я упомянул вопрос, указанный вами в последнем предложении. – yuval

+2

@ user2476373, в то время как я понимаю ваше желание найти решение, которое проверяет размер файла, прежде чем нажимать, вы должны понимать, что это единственный способ __reliable__ для принудительного применения этого ограничения для нескольких людей. Крючок 'pre-commit' является __local__ hook и как таковой не распространяется вместе с репозиторием. На машине сослуживца этот крюк __ не будет существовать__. Возможно, вы захотите сделать __both__, локальный 'pre-commit'-hook и удаленный' update'-hook. –

ответ

5

Это предварительно совершить крюк сделает чек размер файла:

.git/крючки/предварительной фиксации

#!/bin/sh 
hard_limit=$(git config hooks.filesizehardlimit) 
soft_limit=$(git config hooks.filesizesoftlimit) 
: ${hard_limit:=10000000} 
: ${soft_limit:=500000} 

list_new_or_modified_files() 
{ 
    git diff --staged --name-status|sed -e '/^D/ d; /^D/! s/.\s\+//' 
} 

unmunge() 
{ 
    local result="${1#\"}" 
    result="${result%\"}" 
    env echo -e "$result" 
} 

check_file_size() 
{ 
    n=0 
    while read -r munged_filename 
    do 
     f="$(unmunge "$munged_filename")" 
     h=$(git ls-files -s "$f"|cut -d' ' -f 2) 
     s=$(git cat-file -s "$h") 
     if [ "$s" -gt $hard_limit ] 
     then 
      env echo -E 1>&2 "ERROR: hard size limit ($hard_limit) exceeded: $munged_filename ($s)" 
      n=$((n+1)) 
     elif [ "$s" -gt $soft_limit ] 
     then 
      env echo -E 1>&2 "WARNING: soft size limit ($soft_limit) exceeded: $munged_filename ($s)" 
     fi 
    done 

    [ $n -eq 0 ] 
} 

list_new_or_modified_files | check_file_size 

Выше сценарий должен быть сохранен как .git/hooks/pre-commit с разрешениями на выполнение (chmod +x .git/hooks/pre-commit).

по умолчанию мягкие (предупреждение) и жесткие (ошибки) ограничения размера устанавливаются в 500000 и 10000000 байт, но может быть переопределена через hooks.filesizesoftlimit и hooks.filesizehardlimit настройки соответственно:

$ git config hooks.filesizesoftlimit 100000 
$ git config hooks.filesizehardlimit 4000000 
+1

Это довольно хорошо, но вы хотите 'read' без' -r' как 'git diff -name -status' кодирует имена файлов. (Другой вариант заключается в использовании возможности '-z' и bash использовать нулевое завершение, но это ограничивает вас bash.) Вы также можете просто использовать' git diff -name-only -diff-filter = d' (при условии, что новый достаточно Git-версии, чтобы понять нижний регистр 'd', иначе пропишите его с помощью' ACMRTUXB', хотя некоторые из них не могут произойти в любом случае), а затем устранить 'sed'. – torek

+0

@torek 'read' * без *' -r' * as * 'git diff - name-status' * кодирует имена файлов * Не знал этого. Добавлен декодирование имен файлов в скрипт. – Leon

0

Существует общий крюк предварительной фиксации. Вы можете написать скрипт, чтобы проверить размер файла, а затем принять или отклонить фиксацию. Git, однако, дает пользователю возможность обойти проверку) из командной строки типа «git help hooks» для получения дополнительной информации. Вот соответствующая информация о крюке предварительной фиксации.

перед фиксацией

Этот хук вызывается мерзавца фиксации, и может быть обойдена с --no-проверки опции. Он не принимает никаких параметров и вызывается перед получением предлагаемого сообщения журнала фиксации и совершения фиксации. Выход с ненулевым статусом из этого сценария заставляет git commit прерываться.

+0

Я не вижу ответа. Отсутствует ссылка? – Christoph

2

Вам необходимо реализовать eis script, который вы уже искали в pre-commithook.

Из документации, мы узнали, что перед фиксацией ловушки

не принимает никаких параметров, и вызывается до получения предлагаемого сообщения коммита и сделать коммит. Выход с ненулевым статусом из этого сценария приводит к тому, что команда git commit прерывается перед созданием фиксации.

В принципе, крючок вызывается, чтобы проверить, разрешено ли пользователю совершать его изменения.

Сценарий первоначально сделан eis на other post становится

#!/bin/bash 
# File size limit is meant to be configured through 'hooks.filesizelimit' setting 
filesizelimit=$(git config hooks.filesizelimit) 

# If we haven't configured a file size limit, use default value of about 10M 
if [ -z "$filesizelimit" ]; then 
     filesizelimit=10000000 
fi 

# You specify a warning limit 
filesizewarning=500000 

# With this command, we can find information about the file coming in that has biggest size 
# We also normalize the line for excess whitespace 
biggest_checkin_normalized=$(git ls-tree --full-tree -r -l HEAD | sort -k 4 -n -r | head -1 | sed 's/^ *//;s/ *$//;s/\s\{1,\}/ /g') 

# Based on that, we can find what we are interested about 
filesize=`echo $biggest_checkin_normalized | cut -d ' ' -f4,4` 

# Actual comparison 
# To cancel a push, we exit with status code 1 
# It is also a good idea to print out some info about the cause of rejection 
if [ $filesize -gt $filesizelimit ]; then 

     # To be more user-friendly, we also look up the name of the offending file 
     filename=`echo $biggest_checkin_normalized | cut -d ' ' -f5,5` 

     echo "Error: Too large push attempted." >&2 
     echo >&2 
     echo "File size limit is $filesizelimit, and you tried to push file named $filename of size $filesize." >&2 
     echo "Contact configuration team if you really need to do this." >&2 
     exit 1 
elif [ $filesize -gt $filesizewarning ]; then 
     echo "WARNING ! A file size is bigger that $filesizewarning" 
fi 
exit 0 
+1

Этот скрипт проверяет размеры зафиксированных файлов (соответствует HEAD) и, следовательно, не подходит в качестве крючка предварительной фиксации – Leon

Смежные вопросы