C++ 如何将结构化 git 日志的输出解析为对象
C++ How to parse the output of a structured git log into an object
问题:将具有结构化提交消息的 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_hash
、VAL_A
、VAL_B
、OPTIONALVAL_1
和OPTIONALVAL_2
。可选值可以为空,但VAL_A
和VAL_B
不能。
我的方法:
- 将 git 日志输出转储到临时文件中。
- 逐行读取文件,如果它以单词"commit"开头,则将空格后面的字符保存到新对象的
git_commit_hash
中。 - 跳过接下来的三行。
- 保存两个必需的
VAL_A
和VAL_B
值。 - 由于值可能会溢出到下一行,因此请继续向下,检查是否在行首设置了
OPTIONALVAL_1
和/或OPTIONALVAL_2
,如果是,请保存它。 - 到达单词"commit"后停止解析当前对象。创建一个新对象,然后重复 1-5。
这是一种蛮力方法,有些效果,但没有灵活性。我想知道是否有人可以指出我一个更优雅的解决方案或 c++ 或 boost 库。谢谢。
您可以使用自己的 git 日志格式,使用如下所示的漂亮格式:
git log --pretty=format:"<your formatting>"
如果您以易于解析的方式放置每个元素(例如,使用所需的数据定义 xml,然后使用boost::property_tree
提取数据),则可以轻松读取文件并准确知道哪些信息在哪里,而无需解析整个日志。
此线程中的详细信息:将 Git 日志输出到 XML、JSON 或 YAML?
相关文章:
- 无法输出对象的红色/绿色/蓝色值
- 为对象分配整数.输出将是什么?
- 为什么两种不同的对象初始化方式给出不同的输出
- 尝试重载输出运算符时,我无法遍历对象向量
- 如何在 c++ 中使用 for 循环输出矢量中的所有对象
- IM 试图显示对象数组,但它给出了错误的输出
- C++对象数组的文件输出
- OBJDUMP给出了具有和没有-fpic的对象文件的相同输出
- 我使用箭头运算符打印出对象的变量值,并得到一些随机值作为输出
- 对象实例化后不输出
- 打印对象矢量的意外输出
- 具有GSOAP的序列化对象,以验证Web服务输出
- C++输出对象中的所有成员
- 如何仅在对象存在/特定情况下输出对象的某个部分?
- C++ 将数组打印到任何输出对象(按函数)
- ".hidden"输出对象转储 -t 的输出是什么意思?
- 输出对象中唯一字符的数量
- 流操作,用于以不同格式输出对象数据
- 重载运算符<<在不使用友元函数的情况下输出对象成员
- 输出对象的多维向量