2016-09-19 6 views
6

私は技術的にはこれを複製にするthis questionを完全に認識していますが、解答はの解決策しか提供しません。コミット時のファイルサイズを制限する方法は?

コミット時にファイルサイズを制限するオプションはありますか?

たとえば、ファイルサイズが500Kを超えると警告が表示されます。ファイルサイズが10Mを超えると、コミットが停止します。

+0

可能重複gitリポジトリ](http://stackoverflow.com/questions/7147699/limiting-file-size-in-git-repository) – bbodenmiller

+0

@bbodenmiller、これは複製ではありません。私の質問を最後まで読んだことがありますか?私はあなたが最後の文で指定した質問に言及しました。 – yuval

+2

@ user2476373私は、あなたがあなたが複数の人々のためにこの制限を強制する唯一の__reliable__方法であることを理解する必要があります押す前にファイルサイズをチェックするソリューションを見つけるあなたの欲求を理解しています。 'pre-commit'フックは__local__フックなので、リポジトリには配布されません。同僚のマシンでは、このフックは存在しません。ローカルの 'pre-commit'フックとリモート' update'フックを__both__したいかもしれません。 –

答えて

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)。

デフォルトソフト(警告)とハード(エラー)サイズ制限500,000と10,000,000バイトに設定されているが、それぞれhooks.filesizesoftlimithooks.filesizehardlimit設定によりオーバーライドすることができる:制限ファイルサイズの

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

これはかなりいいですが、 '-r'を' read-only'を 'git diff --name -status'はファイル名をエンコードします。 (もう1つのオプションは '-z'とbashのゼロ終了を使う能力ですが、bashに制限されます)' git diff --name-only --diff-filter = d'を使うこともできます小文字の 'd'を理解するのに十分なGitバージョン、' ACMRTUXB'で綴りますが、これらのうちのいくつかはとにかく起こりません)、 'sed'を削除します。 – torek

+0

@torek 'read' *なし*' -r' *として* 'git diff --name-status' *ファイル名をエンコードする*これを知らなかった。スクリプトにファイル名のデコードを追加しました。 – Leon

0

一般的なプリコミットフックがあります。ファイルサイズを確認するスクリプトを作成し、コミットを受け入れるか拒否することができます。 Gitは、コマンドラインから "git help hooks"というタイプのチェックをバイパスする機能を提供します。ここにpre-commitフックに関する関連情報があります。

事前にコミット

このフックはコミットgitのことで呼び出され、--no-verifyオプションでバイパスすることができます。パラメータは不要で、提案されたコミットログメッセージを取得してコミットする前に呼び出されます。このスクリプトから0以外の状態で終了すると、git commitが中止されます。

+0

私は答えを見ることができません。リンクがありませんか? – Christoph

2

すでにpre-commithookで探しているeis scriptを実装する必要があります。

はドキュメントから、我々は

はパラメータを取らず、そしてが提案されているコミットログメッセージを取得し、をコミット行う前に呼び出されるフックを事前にコミットすることを学びました。このスクリプトから0以外の状態で終了すると、コミットを作成する前にgit commitコマンドが中止されます。

基本的には、ユーザーが変更をコミットできるかどうかを確認するためにフックが呼び出されます。

もともとother posteisによって作られたスクリプトは

#!/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

関連する問題