批量遍历Git仓库执行git log缺换行致行粘连如何修复
问题根因
判断准确:git log的--pretty=format:配置默认只会在多条提交记录之间插入换行符,不会在整个输出的最后一条记录末尾追加换行。当一个仓库的git log执行结束后,输出流没有终止换行,下一个仓库输出的第一条提交记录就会直接拼接在上一行末尾,最终出现行粘连的异常输出。
修复方案
优先使用git原生支持的tformat格式替换原有的format,这是最简洁、最适配管道场景的解法:tformat全称为terminator format,和format的唯一区别就是会给每一条提交记录(包括最后一条)的末尾都追加换行符,从根源避免无换行导致的拼接问题。
修复后的完整命令如下:
for repo in */; do (cd "$repo" && git log -G request --pretty=tformat:"%ad %h in ${repo%/} by %an, %s" --date=iso --since=2022-05-01); done | sort -r
命令附带两个鲁棒性优化:
- 将遍历目标从
*改为*/,仅匹配当前目录下的子目录,避免误将普通文件识别为仓库目录触发执行错误 - 对路径变量加引号包裹,同时用
${repo%/}去掉目录遍历自动追加的末尾斜杠,兼容带空格的目录名,输出格式更整洁
如果不想修改git log的格式参数,也可以选择在每个仓库的git log执行完成后手动补打一个换行,效果等价:
for repo in */; do (cd "$repo" && git log -G request --pretty=format:"%ad %h in ${repo%/} by %an, %s" --date=iso --since=2022-05-01 && echo); done | sort -r
注意:如果子目录中存在不是Git仓库的目录,上述命令会输出cd或git的报错信息,在git log命令后追加
2>/dev/null丢弃错误输出即可。
内容的提问来源于stack exchange,提问作者guettli
相关产品推荐
相关产品推荐

