Git提交的时候,有的时候很容易将目录下的非源代码的文件(如二进制文件、模型等)提交到Git仓库里,给后续的使用造成麻烦。那么有没有一种方法来限制提交到Git的文件的大小呢,答案是Yes,下面我来大概介绍下吧。
原理是利用Git的钩子来在commit之前执行一个脚本,在这个脚本里对提交的文件大小进行检查。
具体操作是:修改仓库下的.git/hooks/pre-commit
为如下内容(如果没有这个文件请新建):
#!/bin/sh
hard_limit=$(git config hooks.filesizehardlimit)
soft_limit=$(git config hooks.filesizesoftlimit)
: ${hard_limit:=10000000} # 10M
: ${soft_limit:=1000000} # 1M
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
这里设置了soft_limit
和hard_limit
,默认的大小分别是1M和10M,当提交的某个文件超过1M时,会显示警告;当超过10M时,会显示错误,导致commit失败。
此外,可以通过git config命令来设置soft_limit和hard_limit的值:
git config hooks.filesizehardlimit 20000000
git config hooks.filesizesoftlimit 2000000
请根据自己的使用情况酌情修改具体的数值。
需要注意的是,.git目录下的文件Git是没有跟踪的,因此在别的电脑或目录下git clone
仓库后,pre-commit文件并不会被自动clone进来,需要手动添加。
我在GitHub Gist上提交了这个文件,有需要的小伙伴可以直接下载使用。
参考资料:
https://stackoverflow.com/questions/39576257/how-to-limit-file-size-on-commit
文章选自:http://vra.github.io/2019/03/10/git-reject-large-file-when-commit/