如何进行预提交挂钩以防止非UTF-8文件编码

时间:2010-06-30 11:26:03

标签: svn git pre-commit-hook

是否可以为git或svn制作一个可以拒绝未在特定编码中提交的文件的预先提交挂钩?

我曾参与过多个项目,在这个项目中,坚持某种文件编码似乎是一个问题(例如UTF-8)

3 个答案:

答案 0 :(得分:8)

您的 iconv 可能会告诉您某些内容是否不是UTF-8,但其他编码可能并不那么容易(尤其是8位单字节编码,如ISO-8859-1)

对于Git,您实际上可能需要更新挂钩而不是预提交挂钩(以便它可以在中央存储库中运行以强制执行规则)。

Git pre-commit hook:

#!/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 ls-files 命令行的--之后放置一个或多个Git路径规范,以限制检查的路径名。

要检查更新挂钩中更新的ref的提示,请使用git ls-tree --name-only -r -z $3 -- |生成路径名(注意:它不处理模式路径规范,如 git ls-files ,所以shell代码中的任何基于模式的过滤)和git show "$3:$f"来提取文件内容。您可能还希望不仅检查提示提交,还要检查每个新提交(git rev-list ^$2 $3中的每个提交的循环,而不仅仅是$3)。

答案 1 :(得分:4)

预先挂钩只是脚本。因此,如果您可以在脚本中告诉编码,那么您可以使用该信息来拒绝错误的文件类型。

您可以在文件中搜索正常字符范围之外的字符。如果有一个幻数或标记告诉您文件的编码,您可以检查。否则问自己“我怎么知道这个文件编码错误?”你能编码吗?

答案 2 :(得分:2)

您可以使用iconv实用程序将编码从UTF-8更改为例如UTF-16。如果更改失败,则源文件的编码不正确:

$ iconv -f UTF-8 -t UTF-16 Strings.java 
ÿþ
testing = iconv: illegal input sequence at position 11