[英]Check that the file is not binary in pre receive hook
在服务器端的git pre-receiveve钩子中,我使用以下命令获取提交中的文件列表:
my @new_file_list = `git diff --name-only $old..$new`;;
通过循环,我得到每个文件的大小:
foreach $file (@new_file_list)
{
$size = `git cat-file -s $new:$file`;
通过使用什么命令,我可以得到一个布尔变量,该变量将定义提交中的文件是否为二进制文件? 所以我在输入中有一个文件名 ,以及$ old $ new修订版,如果文件是二进制文件,可以定义什么命令?
提前致谢。
Perl有许多文件测试操作符,它们会告诉您有关文件的各种信息(您已经在使用-s
)。 其中包括以下内容(摘自文档 ):
-T文件是ASCII或UTF-8文本文件(启发式猜测)。
-B文件是“二进制”文件(与-T相反)。
值得强调的是,这只是一种启发式方法。 Perl检查文件的开头,并检查看起来可打印的字符比例。
因此,您可以像下面这样在代码中使用它们:
if (-B $filename) {
# file is (probably) binary
}
这取决于您确切想要实现的目标和成本。 如果要防止由于编译而意外提交文件,只需添加一个.gitignore文件以排除提交(顺便说一句,这始终是个好主意,还排除备份副本和编辑器临时文件),然后进行挂钩检查如果已提交文件的扩展名在允许列表中。
Perl中前面提到的-T / -B检查很好,但是,阅读建议的文档是很好的。 它比检查扩展名的效率低,但是它使用文件的实际内容给出了答案。
如果-B / -T启发式文件(如文档中所述)不适合您的需求,请使用file。 在Perl中,您已经可以使用以下软件包:
File::Type
File::LibMagic
File::MMagic
您将收到文件的MIME类型,并且需要编写一些逻辑来解释结果。
除非没有我们不知道的特定要求,否则我个人会坚持使用.gitignore并检查扩展名。 (可选)对于开发人员将禁止的文件提交到存储库中,您可以考虑使用某种类型的控制棒(最好是虚拟的,因为通常不考虑体罚)。
您可能已经注意到,Git有时会告诉您“二进制文件...和...不同”。
根据对类似问题的回答 ,Git通过查看前8,000个字节来检查文件是否为二进制。 如果它们包含NUL字节,则Git认为该文件是二进制文件。
您可以在钩子中使用git diff
,让Git决定:
if git diff --numstat $old $new -- $file | grep -q -P -e '-\t-\t'; then
# binary
else
# text
fi
对于与Git无关并且不在任何存储库中的文件,这甚至是可能的。 如果
git diff --no-index --numstat /dev/null $some_file
打印dash-TAB-dash-TAB
然后该文件为二进制文件(从Git的角度来看)。 从文档 :
git diff --no-index [--options] [--] [<path>…]
这种形式是比较文件系统上给定的两个路径。
...
--numstat
与--stat相似,但是以十进制表示法和路径名显示添加和删除的行数,不带缩写,以使其对计算机更友好。 对于二进制文件,输出两个-而不是说0 0。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.