这是一个预先接收的git hook,它应该阻止文件,如果是二进制文件
#!/usr/bin/perl
###########################################
use strict;
use warnings;
our $host = `uname -n`;chomp $host;
our $repo = `pwd`;chomp;
if ( $repo =~ /^(.+)\.git/ ){
$repo = $1;
}
$repo =~ /([^\/]+)$/;
$repo = $1;
chomp $repo;
print "========================================================\n";
print "GIT hook.....: pre-commit\n";
print "GIT server...: $host \n";
print "GIT Repo.....: $repo \n";
print "========================================================\n";
my @new_file_list = `git diff --cached --name-only --diff-filter=A`;
foreach $file (@new_file_list)
{
chomp($file);
# Check if file is binary
if (-B $file)
{
print STDERR "WARNING: $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;
}
}
你能告诉我,如果它能正常工作我怎么检查?
我试图像这样创建一个二进制文件
echo -n -e \\x48\\x00\\x49\\x00 > myfile
或者
echo "0000 4865 6c6c 6f20 776f 726c 6421 0000" > text_dump
xxd -r -p text_dump > binary_dump
但是当我推动它们时,这个钩子并不会阻止这些文件。
答案 0 :(得分:1)
你用字符串填充文件," Hello world!"根据{{1}}
不符合二进制的条件检查文件的第一个块左右是否为奇数字符 作为奇怪的控制代码或高位设置的字符。如果是的话 找到许多奇怪的字符(> 30%),它是一个-B文件;
您可以尝试生成满足此条件的字节序列,或将perldoc -f -B
的二进制文件的一部分复制到文件中。