文档管理中心

阅读开源代码小技巧:Git历史记录快速翻页式签出

通过阅读源码来学习开源项目是最直接也最有效的方法。而想要了解一个开源项目,最好是从第一个commit开始看起,特别是第一个最小可用版本发布前的commits,通过阅读对每一次commit提交源码,能够最直接的理解作者的设计思路和开发过程中的思考。

在GitHub的repository页面上可以很方便的看到所有历史记录及其演进。不过,使用IDE或有跳转功能的编辑器来阅读会更方便。这就需要我们将代码仓Clone到本地。

Clone下来的开源Git仓,想要签出第一次commit也简单:通过 git log --reverse 倒序展示log,排在第一个的即是第一次commit,拷贝commit sha值,然后 git checkout commit_sha 便可以签出该commit的代码。

当我们想继续跟着作者的节奏看接来下开发的内容,便需要再次show log,并找出下一次的commit sha值,如果commit记录很多,找起来就不那么容易了。因此我在看git代码历史的时候想,能不能将git commits历史记录当成像网站页面一样可以分页查看呢,通过简单的上翻下翻命令来checkout到各commit节点的代码。

其实也不难,无非是用管道将上面提到的命令串起来,写成shell可执行文件放到git安装的bin目录即可。签出第一次Commit节点代码的shell脚本如下:(通过 git log --reverse --pretty=%H 可以将log记录倒序并只显示sha值,然后通过args获取管道输出checkout。)

#!/bin/sh

first() {
branch=refs/heads/master
git log --reverse --pretty=%H $branch | head -1 | xargs git checkout
}
first

将它存为 git-first 可执行文件,放到git安装的bin目录(Linux、Mac或Windows皆可)。在git仓中执行 git first 即可checkout出第一次commit节点的代码。

签出当前commit记录的下一个节点代码要稍微复杂些,不过也就是多了些命令的组合,stackoverflow搜一下就能找到。通过 git rev-parse HEAD 可获取当前工作区代码的commit sha值,然后用 grep -A 找出倒序log后当前commit sha值的后一条记录,得到sha值后进行Checkout操作。git-next 的脚本如下:

# git-next

next() {
branch=refs/heads/master
git log --reverse --pretty=%H $branch | grep -A 1 $(git rev-parse HEAD) | tail -1 | xargs git checkout
}
next

同样的,签出最后一条记录(git-last)和上一条记录(git-prev)也可以通过命令组合来实现。我还增加可选参数,可以一次上翻/下翻 n条commit。四个脚本的源码放在了GitHub Gist上。

在查看git仓库源码时便可以通过 git next, git prev 来轻松逐个commit进行checkout了。也可以通过 git next 5 来签出当前commit依次往后第5条commit的代码。 通过git first, git last 来签出第一条commit及最后一条节点的代码。

于是,拿到一份开源代码后,我便首先通过 git first 签出第一次commit的代码,然后通过 git next 逐个commit进行阅读。为了快速了解commit之间的差异,可以通过执行 git diff HEAD^ HEAD 来了解当前commit改了哪些内容。(嫌每次执行diff命令太长,可以设置alias: git config --global alias.df 'diff HEAD^ HEAD'。这样,每次仅需执行 git df 便可以快速浏览差异了。)

在调试脚本时发现一个问题,shell中的函数如果写上function在Ubuntu等Linux上反倒执行会报错。比如first() {...} 写成 function first() {...}. 执行时会报 syntax error: '(' unexpected. 的错误。上网查了一下,了解到在某些Linux发行版上 sh 指向 dash,不识别 function标志符。 解决办法是要么将脚本的执行器改成 bash ,或直接将 function 去掉,这也是能兼容多种shell的最好方式。

By:HW-HZY

点赞
收藏
回复
5
分享
举报
浏览1674 编辑于2019-08-23 09:06未知归属地
全部评论
最多点赞
最新发布
最早发布
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。