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

Jes*_*sen 11 svn git pre-commit-hook

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

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

Chr*_*sen 8

你的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"

' -
Run Code Online (Sandbox Code Playgroud)

--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).