C++ 如何将结构化 git 日志的输出解析为对象

C++ How to parse the output of a structured git log into an object

本文关键字:输出 对象 日志 结构化 git C++      更新时间:2023-10-16

问题:将具有结构化提交消息的 git log 的输出解析为对象。

这是此特定目录的日志外观:

commit 7df03ac69f27f80887cc588ab7bec7e38a42d3db
Author: John Doe <johndoe@yahoo.com>
Date:   Thu Apr 6 19:43:18 2017 +0200
VAL_A "Something"
VAL_B "Goodbye"
OPTIONALVAL_1 "Hello World n"
commit 9d9c69f2798778yyuyuu6786767tc7e38a42d3db
Author: John Doe <johndoe@yahoo.com>
Date:   Thu Apr 6 19:43:18 2017 +0200
VAL_A "Hello World"
VAL_B "Goodbye World"
OPTIONALVAL_2 "Hello again World n"
commit 666669f2798778yyuyuu6786767tc7e38a42d3db
Author: John Doe <johndoe@yahoo.com>
Date:   Thu Apr 6 19:43:18 2017 +0200
VAL_A "Hello World"
VAL_B "Goodbye World"

其中每个提交将被解析为一个对象,该对象具有成员变量git_commit_hashVAL_AVAL_BOPTIONALVAL_1OPTIONALVAL_2。可选值可以为空,但VAL_AVAL_B不能。

我的方法:

  1. 将 git 日志输出转储到临时文件中。
  2. 逐行读取文件,如果它以单词"commit"开头,则将空格后面的字符保存到新对象的git_commit_hash中。
  3. 跳过接下来的三行。
  4. 保存两个必需的VAL_AVAL_B值。
  5. 由于值可能会溢出到下一行,因此请继续向下,检查是否在行首设置了OPTIONALVAL_1和/或OPTIONALVAL_2,如果是,请保存它。
  6. 到达单词"commit"后停止解析当前对象。创建一个新对象,然后重复 1-5。

这是一种蛮力方法,有些效果,但没有灵活性。我想知道是否有人可以指出我一个更优雅的解决方案或 c++ 或 boost 库。谢谢。

您可以使用自己的 git 日志格式,使用如下所示的漂亮格式:

git log --pretty=format:"<your formatting>"

如果您以易于解析的方式放置每个元素(例如,使用所需的数据定义 xml,然后使用boost::property_tree提取数据),则可以轻松读取文件并准确知道哪些信息在哪里,而无需解析整个日志。

此线程中的详细信息:将 Git 日志输出到 XML、JSON 或 YAML?