1、功能
提交入库前,检查Unity工程目录下的新增、删除操作必须带着meta文件。
为了快速测试,首先用了Client Hooks,这一试还发现了少麻烦,个人感觉Hooks这事还是SVN提供的支持好用。
2、坑&实现&解决
2.1 获取提交的变更文件列表
Git提交划分了多个阶段(工作区、暂存区、本地仓库),怎么拿到对的变更集成为了第一个问题。提交的检查理论上是暂存区跟本地仓库的差异,可用的命令如下:
shell> git diff-index --cached --name-status HEAD
shell> git diff --staged --name-status
拿到变更文件列表后,又遇到新问题
新增=>新建文本文档.txt
Git有个core.quotepath的设置,值为true会对中文路径进行转义。该情况下,做检查跟报错提示要处理两个点:
去掉两端的引号
逆向转义,还原路径名
命令行直接返回的内容,类似是一个RawString的结果,逆转义要走两步处理:
# 对RawString的内容进行二次转义
escape_txt = eval('%s' % txt)
# 得到正常String的内容,再处理quote的转义
rst = escape_txt.encode(encoding='raw_unicode_escape').decode()
这些操作度娘也没有介绍,是一通乱猜撞出来的方案。
2.2 GUI工具里中文输出乱码
我用的是SmartGit,通过print输出错误信息时,中文全是乱码。原因大概是控制台的编码格式,跟Python代码的编码不一致。很多文章都乱写,在代码里各种encode、decode,或者文件头加coding注释,下面这篇终于给出了正解!!!
# 修改标准输出流编码,保证中文正常显示
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8')
3、小结
这次Git Hooks的实现,解决了3个小的日常问题:
Python在IDE的控制台里,中文输出乱码:TextIOWrapper
如何对str进行二次转义:eval
如何获得str中的bytes(不是str转换为bytes): encode(encoding='raw_unicode_escape')
str二次转义
获得str中的bytes