搜索和处理git对象

搜索和处理git对象,git,git-bash,Git,Git Bash,我正在尝试筛选git存储库中文件的历史内容。在一些文件中有一行包含字符串“BEAM:a_BOOK”,在第7行中,以逗号分隔的值是我要检索以供进一步处理的值。我认为,理想情况下,我最终会得到一个类似于字典的东西,其中包含提交的SHA-1散列,这是该文件过去版本的图书值 文件前几行的示例。请注意,我希望从此版本的文件中检索的值为“56.0”: 日期:2018-12-21 01:49:16.888 PV,已选,时间戳,状态,严重性,值类型,值,回读,回读值,增量,只读 REA_EXP:LINE,015

我正在尝试筛选git存储库中文件的历史内容。在一些文件中有一行包含字符串“BEAM:a_BOOK”,在第7行中,以逗号分隔的值是我要检索以供进一步处理的值。我认为,理想情况下,我最终会得到一个类似于字典的东西,其中包含提交的SHA-1散列,这是该文件过去版本的图书值

文件前几行的示例。请注意,我希望从此版本的文件中检索的值为“56.0”:

日期:2018-12-21 01:49:16.888
PV,已选,时间戳,状态,严重性,值类型,值,回读,回读值,增量,只读

REA_EXP:LINE,01544047322.881066957,无报警,无,枚举,“JENSA~[UDF;AT-TPC;GPL;JENSA]”,“--”和“true”

REA_BTS19:BEAM:OPTICSFILE,01541798820.065952460,无报警,无,字符串,“BTS19_test3.data”、“--”和“true”

REA_BTS19:BEAM:A_BOOK,01545322510.562031883,无报警,无,双精度,“56.0”、“--”、“true”

最后,我将扩展它以检索几个值,并进行一些数学运算以执行更复杂的过滤。更多背景:我们在版本控制下,将用于核物理实验的离子束的原子质量和电荷值存储在文本文件中。这些文本文件充当我们的“存储集”,并填充了比质量和电荷信息更多的信息,因为它们还包含机器值,如果我们想再次运行该光束,我们将恢复这些值。我的目标是通过我们运行的光束的荷质比来过滤这些文件

到目前为止,这似乎为我提供了大部分信息:

git grep'BTS19:BEAM:A_BOOK'$(git rev list--all)| grep RFQ-JENSA_Setpoint.snp

它吐出了这样的东西:

16eca44985214b790eb6ca8241ad86728b4fd3ae:RFQ-JENSA\U设定点。snp:REA\U BTS19:BEAM:A\U BOOK,01531323944.085330133,无报警,无,双精度,“2.0”,“-”,“真”

6e585c905444f25e18edfe1eeb32ced2de72ed7c:RFQ-JENSA_设置点。snp:REA_BTS19:BEAM:A_BOOK,01531323944.085330133,无报警,无,双,“2.0”、“--”和“真”

bc202d5f21f9829fa3701ca636657ee1b0a73e25:RFQ-JENSA_设置点。snp:REA_BTS19:BEAM:A_BOOK,01531323944.085330133,无报警,无,双,“2.0”,“-”,“真”

等..

但是,我希望看到类似以下内容:

或者,根据我刚才展示的输出,我希望看到类似的结果:

16eca44985214b790eb6ca8241ad86728b4fd3ae:2.0

6e585c905444f25e18edfe1eeb32ced2de72ed7c:2.0

bc202d5f21f9829fa3701ca636657ee1b0a73e25:2.0

等..

最终包括一些数学来展示更有意义的东西:

:/

有没有更好的办法? 检索此信息的好方法是什么


谢谢大家!

> P>在每次修订过程中,您对某个特定文件感兴趣,请考虑将<>代码> <代码>添加到<代码> Git GRP< <代码>调用中。也就是说,而不是:

您可以从以下内容开始:

git grep 'BTS19:BEAM:A_BOOK' $(git rev-list --all) -- RFQ-JENSA_Setpoint.snp
您仍然可以获得行,但速度更快,因为
git grep
可以跳过所有名称中没有
RFQ-JENSA_Setpoint.snp
的文件。(请注意,
与正则表达式不同:如果您真的想允许任何字符,例如,
RFQ-JENSA_SetpointXsnp
RFQ-JENSA_SetpointYsnp
作为文件名,您必须在此处使用
--“RFQ-JENSA_Setpoint?snp”
。我猜您的第二个grep过于宽松了。REs是更多的表达式一般来说,sive比path glob更具说服力,但对于这种特殊情况,即使您的意思是“任何字符”,glob也有
允许这样做。)

更复杂的是,您可能会发现在一个大型存储库中,
$(git rev list--all)
生成的字符串足以超出argv限制。(我猜不出系统上的argv限制是什么。)在这种情况下,您可能需要管道
git rev list--all
xargs

git rev-list --all | xargs -I % git grep 'BTS19:BEAM:A_BOOK' % -- RFQ-JENSA_Setpoint.snp
令人恼火的是,这会为每个修订版生成一个单独的
git grep
,这会使您的速度减慢。(如果您有BSD风格<代码> xARGs<代码>,您可以使用<代码> -j>代码>而不是<代码> -i < />代码;或者考虑GNU命令)

为了打破这些,提取第七逗号分隔值,考虑用<代码> > <代码> > <代码> >使用<代码> AWK < /代码>:

... | sed 's/:/,/' | awk -F, '{print $1 ":" $8}'

尽管如果您需要正确的CSV报价处理,单独的工具可能更合适。(根据您的示例,也可以打印带有引号的
:“2.0”

谢谢您的回复!!我会尽快尝试你的建议,然后再回复。这太酷了!然而,我无法让xargs正常工作。这就是我使用的:
git grep'BTS19:BEAM:A_BOOK'$(git rev list--all)--RFQ-JENSA_Setpoint.snp | sed's/:/,/'| awk-F,{print$1:“$8}”
我承认我没有用
git grep
测试xargs变体,但它似乎应该可以工作。但是,如果您在使用
$(git rev list--all)
时没有耗尽参数空间,那么就不需要xargs,它只会降低速度,因此您可以等到发现需要它时再使用。
... | sed 's/:/,/' | awk -F, '{print $1 ":" $8}'