GNU/Linux >> Linux Esercitazione >  >> Linux

Come limitare la dimensione del file al commit?

Una versione più breve e specifica per bash dello script di @ Leon, che stampa le dimensioni del file in un formato leggibile dall'uomo. Richiede un git più recente per --diff-filter=d opzione:

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

Come con le altre risposte, questo deve essere salvato con i permessi di esecuzione come .git/hooks/pre-commit .

Esempio di output:

Error: Cannot commit 'foo' because it is 117.9MB, which exceeds the hard size limit of 10.0MB.

Questo hook pre-commit eseguirà il controllo della dimensione del file:

.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

Lo script precedente deve essere salvato come .git/hooks/pre-commit con i permessi di esecuzione abilitati (chmod +x .git/hooks/pre-commit ).

I limiti di dimensione predefiniti soft (avviso) e hard (errore) sono impostati su 500.000 e 10.000.000 di byte, ma possono essere sovrascritti tramite hooks.filesizesoftlimit e hooks.filesizehardlimit impostazioni rispettivamente:

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

Linux
  1. Come aumentare le dimensioni dello scambio su Ubuntu Linux

  2. Come impostare il limite della dimensione del caricamento dei file in Apache?

  3. Limita la dimensione del caricamento dei file in NGINX

  4. Come tagliare un file a una determinata dimensione sotto Linux?

  5. Qual è il limite di dimensione di /etc/hosts?

Come funziona Git?

Git Revert Commit:come annullare l'ultimo commit

Come annullare l'ultimo commit in Git

Come modificare il limite di file aperti in Linux

Come limitare la profondità dell'"albero" per l'elenco di file ricorsivi

Procedura:un'introduzione all'uso di Git