Git钩子不会阻止二进制文件
我在服务器端做了一个预接收git钩子。它不允许推送大文件,也不允许推送二进制文件 这是代码的一部分,有问题Git钩子不会阻止二进制文件,git,perl,Git,Perl,我在服务器端做了一个预接收git钩子。它不允许推送大文件,也不允许推送二进制文件 这是代码的一部分,有问题 my @new_file_list = `git diff --name-only $old..$new`;; foreach $file (@new_file_list) { $size = `git cat-file -s $new:$file`; print "!!! file $file"; print "!!! size $size"; chomp($file)
my @new_file_list = `git diff --name-only $old..$new`;;
foreach $file (@new_file_list)
{
$size = `git cat-file -s $new:$file`;
print "!!! file $file";
print "!!! size $size";
chomp($file);
# Check if file is binary
if (-B $file)
{
print STDERR "ERROR: $file is binary.\n";
print STDERR "Please check with repo owner before committing binary files.\n";
print STDERR "To bypass this warning re-run your commit with the '--no-verify' option\n";
exit 1;
}
# Check if file is too large
if ($size > $limit)
{
my $hsize = hsize($size);
my $hlimit = hsize($limit);
print STDERR "ERROR: $file is greater than $hlimit bytes. Size of file is $hsize\n";
print STDERR "Please check with repo owner before committing very large files.\n";
print STDERR "To bypass this warning re-run your commit with the '--no-verify' option\n";
exit 1;
}
}
检查大小限制效果很好,但它根本不会阻止二进制文件。你能告诉我,我的密码有什么问题吗。谢谢
这是一个输出
remote: !!! file Chrysanthemum.jpg
remote: !!! size 879394
remote: !!! file Koala.jpg
remote: !!! size 780831
有关阻止签入二进制文件的挂钩示例,请参见
您正在检查新提交中的文件大小:
$size = `git cat-file -s $new:$file`;
然后使用本地文件系统进行二进制检查:
if (-B $file)
您可能希望这是git cat file$new:$file的结果,而不是使用以下内容:
open my $fh, '-|', 'git', 'cat-file', "$new:$file";
if (-B $fh)
{
exit 1;
}
不是回答,而是重要的评论
`git diff --name-only $old..$new`
及
遭受外壳注射错误的折磨。例如,考虑如果有一个空间的文件被添加到存储库会发生什么情况。
固定的:
use String::ShellQuote qw( shell_quote );
my $cmd = shell_quote('git', 'diff', '--name-only', "$old..$new");
`$cmd`
及
-B测试在二进制文件上正常工作吗?-e$文件正常工作吗?我想$file可能不是文件的完整路径。戴夫·克罗斯,是的,看起来是这样。我怎样才能使它正常工作?是的,我知道了。如何检查git cat file$new:$file的结果?
use String::ShellQuote qw( shell_quote );
my $cmd = shell_quote('git', 'diff', '--name-only', "$old..$new");
`$cmd`
my $cmd = shell_quote('git', 'cat-file', '-s', "$new:$file");
`$cmd`