繁体   English   中英

检查预接收挂钩中的文件不是二进制文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM