用Git命令展示Unix管道之美
Unix哲学**程序别做得太复杂一个程序做好一件事还要方便和其他程序组合起来。**一个程序把结果输出出来另一个程序接着拿这个结果继续处理。Unix里的管道|就是干这个的。在《The Unix Programming Environment》里提到过Unix真正强大的地方往往不在于某一个程序有多厉害而在于这些小程序组合起来以后能做什么。很多命令单独看都只是解决一个很小的问题。但把它们接起来就能组成一个新的工具而且这种组合方式还可以不断复用。书里讲的是这个思想。那如果把它放到Git提交记录上具体应该怎么做比如业务仓库里偶尔会有人问最近这段时间谁提交得最多当然可以专门写个脚本统计。不过按照Unix的思路通常没必要。手边已经有的几个命令接起来往往就够了。用Apache Tomcat源码作为例子实际跑一遍这个过程。先在仓库根目录执行一条命令让Git只输出每次提交的作者名。pretty格式写成format:%an这样每个提交只输出一行git -c format.prettyformat:%an log -80前几行大概是这样Christopher Schultz Mark Thomas Mark Thomas Christopher Schultz Christopher Schultz这里还是按照提交时间倒序排列同一个人会反复出现。光看这串记录很难直接看出谁提交得最多。接下来用Unix里的sort。它可以把每一行按字母顺序排好。同一个人的名字排到一起后面才方便统计git-cformat.prettyformat:%an log-80|sort排完以后Christopher Schultz会挨在一起Mark Thomas也会挨在一起。这时候再接一个uniq。它可以统计相邻的重复行。所以前面的sort不能省否则同一个人的名字如果被其他人隔开uniq就统计不完整。加上-c让uniq在每行前面显示出现次数git-cformat.prettyformat:%an log-80|sort|uniq-c结果类似这样16 Christopher Schultz 1 ChristopherSchultz 1 Dimitrios Soumis 52 Mark Thomas 10 remm现在次数已经统计出来了但还是按照作者名字的字母顺序排列。还差最后一步按照提交次数从大到小排序。sort的-n表示按照数字比较-r表示倒序排列。把它接到后面git-cformat.prettyformat:%an log-80|sort|uniq-c|sort-nr结果就变成52 Mark Thomas 16 Christopher Schultz 10 remm 1 Dimitrios Soumis 1 ChristopherSchultz这样一个简单的提交排行就完成了。整个过程没有专门写统计脚本只是把四个现成的命令接了起来Git负责取数据 → sort负责排序 → uniq -c负责计数 → sort -nr负责按次数重新排序。这其实就是Unix管道最典型的用法。前一个命令把结果交给后一个命令每个命令只负责自己那一步。命令很小但组合起来就能完成一个完整的任务。而且这里有个细节很值得注意sort和uniq的顺序不能反。uniq只统计相邻的重复行所以必须先把相同的名字排到一起才能正确计数。这条管道里每个命令到底做了什么上面那段输出本身并不复杂真正容易搞混的是中间这几步。四个命令分别负责什么可以直接看下面这张表命令单独做的事不串的话git log每个提交输出一行作者名只有提交流水看不出谁提交得多sort按字母顺序把行排好同一个人的名字可能分散uniq就会漏数uniq -c合并相邻的重复行并统计次数没有先sort统计结果就不准sort -nr按数字从大到小重新排序结果还是按作者名字排列无法形成排行榜其实还有一条现成的命令可以完成类似的事情。git shortlog -sn就能直接输出提交次数排行。不过管道的意义并不是为了替代这条命令。这里真正值得注意的是**sort和uniq**根本不需要知道Git是什么。换成一份普通的文本作者列表同样可以用这套组合。数据来源变了sort和uniq还是照样工作。如果专门给Git仓库做一个提交排行功能换一种数据来源可能又得重新写一套。而这些Unix小工具只管处理输入不关心这些文本到底来自Git、日志还是其他程序。榜单里还有一个很容易被忽略的细节。Christopher Schultz有16次另外还有一行ChristopherSchultz只有1次。人眼看上去很容易认为这是同一个人。但uniq比较的是完整的字符串中间有没有空格、名字怎么拼只要不完全一样就会被当成两个人。Git日志里出现这种署名不统一的情况并不奇怪。管道也不会替你判断两个名字是不是同一个人它只负责处理传进来的文本。还有一个实际问题如果是在Windows上操作这条命令最好放到Git Bash里运行。PowerShell里的sort和Unix的sort不是一回事而且PowerShell本身也没有Unix那个uniq命令。Git for Windows自带的usr/bin目录里有sort、uniq这些Unix工具在Git Bash里运行才能和上面的命令保持一致。所以业务里遇到类似的统计需求时不一定要马上加一个统计模块。**先看看手里的小工具能不能接起来。**很多时候几个简单命令配上一条管道就已经够用了。

相关新闻

Windows驱动清理怎么安全完成?Driver Store Explorer(RAPR)使用指南

Windows驱动清理怎么安全完成?Driver Store Explorer(RAPR)使用指南

Windows驱动清理怎么安全完成?Driver Store Explorer(RAPR)使用指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 一句话价值: 本文用一…

2026/10/27 23:29:45 阅读更多 →
接口自动化测试平台(ITP)操作说明

接口自动化测试平台(ITP)操作说明

1. 平台概述 接口自动化测试平台Interface Test Platform(ITP)是一款基于Web的自动化测试工具,主要用于接口测试、业务流程测试、测试任务管理等功能。平台提供了完整的用户权限管理、项目管理、环境配置、测试用例编写与执行、测试报告生成…

2026/10/27 23:29:45 阅读更多 →
流放之路Build规划终极指南:5分钟用Path of Building离线算出真实伤害

流放之路Build规划终极指南:5分钟用Path of Building离线算出真实伤害

流放之路Build规划终极指南:5分钟用Path of Building离线算出真实伤害 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 还在靠感觉点天赋、凭运气配装备&#…

2026/10/27 5:45:30 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →