是否可以为git或svn制作一个可以拒绝未在特定编码中提交的文件的预先挂起钩子?
我曾经在几个项目上工作,坚持某种文件编码似乎是一个问题(例如UTF-8)
是否可以为git或svn制作一个可以拒绝未在特定编码中提交的文件的预先挂起钩子?
我曾经在几个项目上工作,坚持某种文件编码似乎是一个问题(例如UTF-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"
' -
在之后放置一个或多个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
)。
预先挂钩只是脚本。因此,如果您可以在脚本中告诉编码,那么您可以使用该信息来拒绝错误的文件类型。
您可以在文件中搜索正常字符范围之外的字符。如果有一个幻数或标记告诉您文件的编码,您可以检查。否则问自己“我怎么知道这个文件编码错误?”你可以编码吗?
你可以使用 的iconv 用于将编码从UTF-8更改为例如UTF-16的实用程序。如果更改失败,则源文件的编码不正确:
$ iconv -f UTF-8 -t UTF-16 Strings.java
ÿþ
testing = iconv: illegal input sequence at position 11