重要
core.quotepath 默认值为 true,Git 会将路径中的非 ASCII 字符转义为八进制编码(\346\265\213...)。
cloc 通过 git diff 获取文件列表时,收到的是转义后的路径,无法在仓库中找到对应文件,导致报错。将 core.quotepath 设为 false 让 Git 原样输出中文路径即可。
环境说明
- Ubuntu 18.04
- cloc(apt 安装,版本较老;如需最新版见 Release)
1.简介
需求:按周统计代码增量,用于衡量外包团队工作量。
涉及三个子问题:
| 问题 | 方案 |
|---|---|
| 用什么工具 | cloc(Count Lines of Code) |
| 如何统计最近一周增量 | git log --after 获取起始 commit,cloc --git --diff 对比 |
| 中文文件名报错 | git config --global core.quotepath false |
2.说明
2.1 安装 cloc
| |
2.2 统计一周代码增量
核心思路:找到 7 天前的 commit,再用 cloc 对比该 commit 与当前 HEAD。
| |
| 参数 | 说明 |
|---|---|
--date="1 weeks ago" | 取 7 天前的日期 |
--after | 过滤指定日期之后的 commit |
--pretty=format:"%h" | 只输出 commit 短 ID |
"${logs##*$'\n'}" | bash 参数扩展,取最后一行(最早的一条 commit) |
2.3 中文文件名报错与修复
仓库中存在中文文件名时,cloc 报错:
| |
报错链路:
| |
修复:
| |
core.quotepath 控制 Git 输出路径时是否转义非 ASCII 字符:
| 值 | 行为 | 效果 |
|---|---|---|
true(默认) | 路径中的中文被转义为 \346\265\213... | cloc 无法匹配文件 |
false | 路径原样输出中文 | cloc 正常工作 |
2.4 定时自动统计(cron)
| |
3.总结
- cloc 通过 git 获取文件列表时,依赖 Git 输出的路径可被 git 自身识别;
core.quotepath=true将中文转义为八进制编码,破坏了路径的可识别性;- 将
core.quotepath设为false后,Git 原样输出中文路径,cloc 正常工作。