shell获取git最近一次提交信息_我低估了PowerShell:一个提取Git提交记录并生成文件Diff列表的脚本案例...

本文介绍了如何使用PowerShell编写脚本获取Git提交记录,特别是如何处理提交信息和变动文件列表。作者展示了如何利用PowerShell的强类型系统和.NET库来组织数据,并将结果输出为JSON格式。文章适合有.NET开发背景的程序员,演示了PowerShell在Windows自动化任务中的强大功能。
摘要由CSDN通过智能技术生成

最近需要在 Windows 环境下完成一些自动化操作,于是开始学习 PowerShell 脚本的编写。 本来对 PowerShell 比较无感,因为比较熟悉 Bash Script,觉得 PowerShell 语法似乎比较啰嗦, 而且好多命令还要重头学起,自然就有了一定的抵触情绪。然而我还是太天真了,一切都逃不过真香定律。

本文将从一个实际遇到的需求出发展示 PowerShell 的强大之处,以及它对于熟悉 C#的开发者来说有多么友好。

本文首发于本人博客0x1C.dev,欢迎访问以获得更好的阅读体验。

0x0 知识背景和开发环境

本文假设读者:有基础的git知识(知道git是干吗的);

喜欢用命令行工具(CLI)来提高工作效率;

有基础的Shell脚本编写或阅读经验;

喜欢.NET 技术框架

本文尤其适合有.NET 开发背景的程序员食用。

PowerShell 和.NET 库能够完美配合,因此如果您有.NET (C#) 的开发背景, 那么对于脚本中的各种类型和函数会更容易理解,甚至都不用怎么去理解。

我的运行环境是PowerShell 7.0.2,经测试脚本在5.1版也能跑,更低的版本可能就悬了吧。 不过更低的版本估计也没人用,毕竟国内用的最多的Windows Server 2008 R2都可以装PowerShell 5.1了。

编辑器我用的是VS Code并安装了PowerShell插件, 该插件能够在编写 PowerShell 脚本时提供智能提示、格式化代码等功能。

0x1 需求说明

本文实现的其实是一个很简单的需求:

实现一个命令行脚本,调用方式为:

diff.ps1 [-verbose] [-baseDir BASE_DIR] [-out OUT_FILE] COMMIT_HASH

要求能够:获取提交COMMIT_HASH之后的所有 Git 提交记录,记录中包括提交信息和变动的文件列表。

根据第 1 步得到的提交记录,生成:提交信息列表,按提交时间倒序排列;

BASE_DIR目录下的变动文件的路径列表,按路径升序排列,其中文件路径是基于BASE_DIR的相对路径,且不能重复

3. 若通过-out参数指定了输出路径,则将上述信息写入OUT_FILE文件,否则在 stdout 中打印 JSON 数据。JSON 结构如下:

{

"commits": [...],

"filePaths": [...]

}

4. 通过-verbose标记决定是否打印冗余信息,包括:查询到的提交记录

被记录的变动文件路径

0x2 获取Git提交记录

首先要考虑如何获得便于解析的、带文件路径记录的 Git 提交记录。因为这个不是本文重点,在此我仅作简单说明。

假设要筛选的起始提交 Hash 为abc123,且不包含这个起始 Hash,则获取日志的命令如下:

git log --name-only --no-merges --dense --format="%n>>%h|%ai|%s" abc123..HEAD

简要参数说明如下,更准确的详细说明请参见 git-log Documentation:

--name-only仅显示变动的文件名(路径)

--no-merges不显示合并产生的提交记录,即将父级提交数量限制为1

--dense仅显示选定的提交信息

--format提供提交信息的格式,参数值指定的格式为:(换行)>>短 Hash|类似 ISO-8601 提交时间|提交标题

..HEAD筛选出从到分支头部的提交记录,但不包含

用该命令打印出来的提交信息看起来是这样:

>>32aeee41|2020-06-16 02:04:14 +0800|commit 2

file1.txt

file2.bin

>>9a02956f|2020-06-16 01:44:26 +0800|commit 1

file0.exe

file1.txt

由于每个信息和文件路径都各占一行,因此不难想到只需要按行处理输出便可以得到我们所需的全部信息。 而有了格式化的提交信息,我们便可以很方便的使用正则表达式来进行数据提取了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值