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


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

我曾经在几个项目上工作,坚持某种文件编码似乎是一个问题(例如UTF-8)


11832
2018-06-30 11:26


起源



答案:


你的 的iconv 或许可以告诉你某些东西是不是UTF-8,但其他编码可能不那么容易(尤其是像ISO-8859-1那样的8位单字节编码)。

对于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路径规范 -- 在...上 git ls-files 命令行来限制检查的路径名。

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


7
2018-06-30 12:58





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

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


4
2018-06-30 11:37





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

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

2
2018-06-30 12:00