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