是否有可能爲git或svn做一個預提交鉤子,它可以拒絕沒有以特定編碼提交的文件?如何做一個預先提交鉤子來防止非UTF-8文件編碼
我曾在幾個項目中工作,在那裏它似乎是堅持某個文件編碼(如UTF-8例如)
是否有可能爲git或svn做一個預提交鉤子,它可以拒絕沒有以特定編碼提交的文件?如何做一個預先提交鉤子來防止非UTF-8文件編碼
我曾在幾個項目中工作,在那裏它似乎是堅持某個文件編碼(如UTF-8例如)
你的iconv也許能告訴你,如果事情是不是UTF-8,但其他的編碼可能不那麼容易(尤其是8位單字節編碼,如ISO-8859-1)。
對於Git,您實際上可能需要一個更新掛鉤而不是預先提交掛鉤(以便它可以在中央存儲庫中運行以強制執行規則)。
GIT中pre-commit鉤子:
#!/bin/sh
git ls-files -z -- |
xargs -0 sh -c '
e=""
for f; do
if ! git show :"$f" |
iconv -f UTF-8 -t UTF-8 >/dev/null 2>&1; then
e=1
echo "Not UTF-8: $f"
#exit 255 # to abort after first non-UTF-8 file
fi
done
test -z "$e"
' -
將一個或多個GIT中pathspecs上git的LS-文件--
命令行之後,以限制檢查的路徑名。
要檢查更新ref的尖端在更新鉤,使用git ls-tree --name-only -r -z $3 -- |
以生成路徑名(注意:它不處理圖案pathspecs像GIT中LS-文件,所以做任何基於模式的濾波在殼代碼)和git show "$3:$f"
來提取文件內容。您可能還需要檢查提示提交,但不要只檢查每個新提交(每個提交在git rev-list ^$2 $3
而不是僅限於$3
)的循環。
預提交掛鉤只是腳本的問題。因此,如果您可以在腳本中說明編碼,則可以使用該信息拒絕錯誤的文件類型。
您可以在文件中搜索正常字符範圍之外的字符。如果有一個幻數或標籤告訴你文件的編碼,你可以檢查。否則問自己「我怎麼知道這個文件是錯誤的編碼?」你可以編碼嗎?
您也許可以使用iconv實用程序將編碼從UTF-8更改爲例如UTF-16。而如果更改失敗,源文件是不是在正確的編碼:
$ iconv -f UTF-8 -t UTF-16 Strings.java
ÿþ
testing = iconv: illegal input sequence at position 11