2017-06-07 60 views
0

在我的服務器端git的預先收到鉤,我得到的文件列表中使用此命令提交:檢查該文件中預先不是二進制收到鉤

my @new_file_list = `git diff --name-only $old..$new`;; 

我得到一個大小的每文件,通過循環:

foreach $file (@new_file_list) 
{ 
    $size = `git cat-file -s $new:$file`; 

利用我什麼命令可以得到一個布爾變量,將定義,如果提交的是二進制文件? 所以我有一個文件名在輸入,和$ old $新修訂版,如果文件是二進制文件,什麼命令可以定義?

在此先感謝。

+1

您只能猜測。您可以嘗試'file'或[MIME :: Detect](http://p3rl.org/MIME::Detect),[File :: LibMagic](http://p3rl.org/File::LibMagic), [File :: MMagic](http://p3rl.org/File::MMagic),... – choroba

+0

如何定義「二進制文件」? – ikegami

回答

4

Perl有許多文件測試運算符,它們會告訴你關於文件的各種信息(你已經在使用-s)。這些包括以下(從the documentatioÑ截取):

-T文件是ASCII或UTF-8文本文件(啓發式猜測)。

-B文件是一個「二進制」文件(與-T相反)。

值得強調的是,這只是一種啓發式。 Perl檢查文件的開始,並檢查哪些比例的字符看起來是可打印的。

所以,你可以像這樣在你的代碼中使用這些:

if (-B $filename) { 
    # file is (probably) binary 
} 
+2

你在OP中看到的'-s'開關是切換到'git cat-file',而不是Perl。但顯然它有相同的含義(取大小)。 – PerlDuck

4

這取決於你到底想達到什麼和由什麼成本。如果你想防止意外提交的文件是編譯的結果,只需添加一個.gitignore文件,排除它們被提交(順便說一句,這總是一個好主意,也排除備份副本和編輯器臨時文件),並在鉤子檢查如果提交文件的擴展名在允許列表中。

在Perl中提到的-T/-B檢查很好,但是,閱讀提議的文檔是很好的。它比檢查擴展的效率低,但它使用文件的實際內容給出了答案。

如果文檔中描述的-B/-T啓發式不適合您的需要,請使用file。在Perl你已經獲得幾個包:

File::Type 
File::LibMagic 
File::MMagic 

您將收到MIME類型的文件,你需要編寫一些邏輯來解釋結果。

除非沒有我們不知道的具體要求,否則我個人會堅持使用.gitignore和檢查擴展名。可選地,對於開發人員將禁止文件提交到存儲庫的情況,您可以考慮某種類型的棒(最好是虛擬的,因爲體罰通常會被壓制)。

1

你可能已經注意到Git有時會告訴你「二進制文件...和...不同」。

根據this answer到 類似的問題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的角度來看)。從 docs

git diff --no-index [--options] [--] [<path>…​] 

這種形式是給定的兩條路徑比較在文件系統中。

...

--numstat 

到--stat類似,但顯示在小數點 符號和路徑添加和刪除線,而不縮寫數量,使之更加機友。 對於二進制文件,輸出兩個 - 而不是說0 0.

相關問題