11

是否可以为 git 或 svn 制作一个 precommit 钩子,它可以拒绝未以特定编码提交的文件?

我从事过几个项目,在这些项目中坚持某种文件编码似乎是个问题(例如 UTF-8)

4

3 回答 3

8

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

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

Git 预提交钩子:

#!/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 路径规范以限制检查的路径名。

To check the tip of the updated ref in an update hook, use git ls-tree --name-only -r -z $3 -- | to generate the pathnames (note: it does not handle pattern pathspecs like git ls-files, so do any pattern-based filtering in the shell code) and git show "$3:$f" to extract the file contents. You might also want to check not only the tip commit, but each new commit (loop for each commit in git rev-list ^$2 $3 instead of just $3).

于 2010-06-30T12:58:24.397 回答
4

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

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

于 2010-06-30T11:37:43.527 回答
2

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

$ iconv -f UTF-8 -t UTF-16 Strings.java 
ÿþ
testing = iconv: illegal input sequence at position 11
于 2010-06-30T12:00:26.760 回答