前端同事的静态页面通过SVN传到服务器上后就诡异的多出了一个空行,分析了之后认为是BOM的问题。找到问题了,下面就来说一下解决办法。
对于我们这个遇到的这个问题,应该说有三个方面需要处理:
1、查找现在版本库中所有的BOM文件
2、去除文件中的BOM
3、SVN能不能进行BOM检测,防止有BOM的文件commit
一个个解决吧。
1、因为我们是用svn的POST-COMMIT钩子做了程序自动更新至网站发布目录(测试),服务器是linux环境,所以用命令我们就可以找出所有拥有BOM的文件
查找UTF-8+BOM
shell> grep -r -I -l $’^\xEF\xBB\xBF’ 目录
删除BOM
shell> grep -r -I -l $’^\xEF\xBB\xBF’ /path | xargs sed -i ‘s/^\xEF\xBB\xBF//;q’
通过查找,你就可以可以找到相应的文件,改就行了。
2、去除BOM文件,这个比较简单,有很多IDE都能去掉BOM,例如UltraEdit,editplus,vim等等,自己在google搜一下,好多~
3、上面2个问题是补救,这个就是堵漏了,最好是在开发人员SVN上传的时候就提示他,该文件拥有BOM。用过svn的朋友都知道,在版本目录下会有HOOKS目录,里面都是钩子的模板,我们就用pre-commit这个,记得把pre-commit.tmpl改成pre-commit,然后给可执行权限。
#!/bin/sh
REPOS=”$1″
TXN=”$2″
SVNLOOK=/usr/bin/svnlook
FILES=`$SVNLOOK changed -t “$TXN” “$REPOS” | awk ‘/^[UA]/ {print $2}’`
for FILE in $FILES; do
if $SVNLOOK cat -t “$TXN” “$REPOS” “$FILE” | grep -q $’^\xEF\xBB\xBF’; then
echo “Byte Order Mark be found in $FILE” 1>&2
exit 1
fi
done
保存后即可生效,SVNSERVE不需要重启。这样开发人员如果上传BOM文件的时候,就会提示上传失败,需要重新上传。