Une version plus courte et spécifique à bash du script de @Leon, qui imprime les tailles de fichier dans un format lisible par l'homme. Cela nécessite un git plus récent pour le --diff-filter=d
choix :
#!/bin/bash
hard_limit=$(git config hooks.filesizehardlimit)
soft_limit=$(git config hooks.filesizesoftlimit)
: ${hard_limit:=10000000}
: ${soft_limit:=1000000}
status=0
bytesToHuman() {
b=${1:-0}; d=''; s=0; S=({,K,M,G,T,P,E,Z,Y}B)
while ((b > 1000)); do
d="$(printf ".%01d" $((b % 1000 * 10 / 1000)))"
b=$((b / 1000))
let s++
done
echo "$b$d${S[$s]}"
}
# Iterate over the zero-delimited list of staged files.
while IFS= read -r -d '' file ; do
hash=$(git ls-files -s "$file" | cut -d ' ' -f 2)
size=$(git cat-file -s "$hash")
if (( $size > $hard_limit )); then
echo "Error: Cannot commit '$file' because it is $(bytesToHuman $size), which exceeds the hard size limit of $(bytesToHuman $hard_limit)."
status=1
elif (( $size > $soft_limit )); then
echo "Warning: '$file' is $(bytesToHuman $size), which exceeds the soft size limit of $(bytesToHuman $soft_limit). Please double check that you intended to commit this file."
fi
done < <(git diff -z --staged --name-only --diff-filter=d)
exit $status
Comme pour les autres réponses, cela doit être enregistré avec les autorisations d'exécution en tant que .git/hooks/pre-commit
.
Exemple de sortie :
Error: Cannot commit 'foo' because it is 117.9MB, which exceeds the hard size limit of 10.0MB.
Ce hook de pré-commit fera la vérification de la taille du fichier :
.git/hooks/pre-commit
#!/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
Le script ci-dessus doit être enregistré sous .git/hooks/pre-commit
avec les permissions d'exécution activées (chmod +x .git/hooks/pre-commit
).
Les limites de taille logicielle (avertissement) et matérielle (erreur) par défaut sont définies sur 500 000 et 10 000 000 octets, mais peuvent être remplacées par le hooks.filesizesoftlimit
et hooks.filesizehardlimit
paramètres respectivement :
$ git config hooks.filesizesoftlimit 100000
$ git config hooks.filesizehardlimit 4000000