Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git钩子不会阻止二进制文件_Git_Perl - Fatal编程技术网

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)

我在服务器端做了一个预接收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);

  # 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`