私は技術的にはこれを複製にするthis questionを完全に認識していますが、解答はの解決策しか提供しません。コミット時のファイルサイズを制限する方法は?
コミット時にファイルサイズを制限するオプションはありますか?
たとえば、ファイルサイズが500Kを超えると警告が表示されます。ファイルサイズが10Mを超えると、コミットが停止します。
私は技術的にはこれを複製にするthis questionを完全に認識していますが、解答はの解決策しか提供しません。コミット時のファイルサイズを制限する方法は?
コミット時にファイルサイズを制限するオプションはありますか?
たとえば、ファイルサイズが500Kを超えると警告が表示されます。ファイルサイズが10Mを超えると、コミットが停止します。
この事前コミットファイルサイズのチェックを行いますフックを次のようになります。
.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.filesizesoftlimit
とhooks.filesizehardlimit
設定によりオーバーライドすることができる:制限ファイルサイズの
$ git config hooks.filesizesoftlimit 100000
$ git config hooks.filesizehardlimit 4000000
これはかなりいいですが、 '-r'を' read-only'を 'git diff --name -status'はファイル名をエンコードします。 (もう1つのオプションは '-z'とbashのゼロ終了を使う能力ですが、bashに制限されます)' git diff --name-only --diff-filter = d'を使うこともできます小文字の 'd'を理解するのに十分なGitバージョン、' ACMRTUXB'で綴りますが、これらのうちのいくつかはとにかく起こりません)、 'sed'を削除します。 – torek
@torek 'read' *なし*' -r' *として* 'git diff --name-status' *ファイル名をエンコードする*これを知らなかった。スクリプトにファイル名のデコードを追加しました。 – Leon
一般的なプリコミットフックがあります。ファイルサイズを確認するスクリプトを作成し、コミットを受け入れるか拒否することができます。 Gitは、コマンドラインから "git help hooks"というタイプのチェックをバイパスする機能を提供します。ここにpre-commitフックに関する関連情報があります。
事前にコミット
このフックはコミットgitのことで呼び出され、--no-verifyオプションでバイパスすることができます。パラメータは不要で、提案されたコミットログメッセージを取得してコミットする前に呼び出されます。このスクリプトから0以外の状態で終了すると、git commitが中止されます。
私は答えを見ることができません。リンクがありませんか? – Christoph
すでにpre-commit
hookで探しているeis scriptを実装する必要があります。
はドキュメントから、我々はが
はパラメータを取らず、そしてが提案されているコミットログメッセージを取得し、をコミット行う前に呼び出されるフックを事前にコミットすることを学びました。このスクリプトから0以外の状態で終了すると、コミットを作成する前にgit commitコマンドが中止されます。
基本的には、ユーザーが変更をコミットできるかどうかを確認するためにフックが呼び出されます。
もともとother postにeisによって作られたスクリプトは
#!/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
このスクリプトは(HEADに対応する)コミットされたファイルのサイズをチェックするので、プリコミットフックとしては適切ではありません – Leon
可能重複gitリポジトリ](http://stackoverflow.com/questions/7147699/limiting-file-size-in-git-repository) – bbodenmiller
@bbodenmiller、これは複製ではありません。私の質問を最後まで読んだことがありますか?私はあなたが最後の文で指定した質問に言及しました。 – yuval
@ user2476373私は、あなたがあなたが複数の人々のためにこの制限を強制する唯一の__reliable__方法であることを理解する必要があります押す前にファイルサイズをチェックするソリューションを見つけるあなたの欲求を理解しています。 'pre-commit'フックは__local__フックなので、リポジトリには配布されません。同僚のマシンでは、このフックは存在しません。ローカルの 'pre-commit'フックとリモート' update'フックを__both__したいかもしれません。 –