搜索和处理 git 个对象
Searching and Handling git objects
我正在尝试过滤我的 git 存储库中文件的历史内容。某些文件中有一行包含字符串 'BEAM:A_BOOK',该行的第 7 个逗号分隔值是我要检索以进行进一步处理的值。我认为,理想情况下,我最终会得到类似字典的东西,其中包含提交的 SHA-1 哈希值,以及此文件过去版本的 A_BOOK 值。
文件前几行的示例。请注意,我希望从此版本的文件中检索到的值是“56.0”:
# Date: 2018-12-21 01:49:16.888
PV,SELECTED,TIMESTAMP,STATUS,SEVERITY,VALUE_TYPE,VALUE,READBACK,READBACK_VALUE,DELTA,READ_ONLY
REA_EXP:LINE,0,1544047322.881066957,NO_ALARM,NONE,enum,"JENSA~[UDF;AT-TPC;GPL;JENSA]",,"---",,true
REA_BTS19:BEAM:OPTICSFILE,0,1541798820.065952460,NO_ALARM,NONE,string,"BTS19_test3.data",,"---",,true
REA_BTS19:BEAM:A_BOOK,0,1545322510.562031883,NO_ALARM,NONE,double,"56.0",,"---",,true
最终,我将对其进行扩展以检索几个值并进行一些数学运算以执行更复杂的过滤。更多背景信息:我们将为核物理实验提供的离子束的原子质量和电荷值存储在版本控制下的文本文件中。这些文本文件充当我们的 'save sets',并且填充的不仅仅是这些质量和电荷信息,因为它们还包括如果我们想再次 运行 该光束我们将恢复的机器值。我的目标是通过我们 运行 与它们的光束的 Charge:Mass 比率来过滤这些文件。
到目前为止,这似乎是我的大部分信息:
git grep 'BTS19:BEAM:A_BOOK' $(git rev-list --all) | grep RFQ-JENSA_Setpoint.snp
它吐出这样的东西:
16eca44985214b790eb6ca8241ad86728b4fd3ae:RFQ-JENSA_Setpoints.snp:REA_BTS19:BEAM:A_BOOK,0,1531323944.085330133,NO_ALARM,NONE,double,"2.0",,"---",,true
6e585c905444f25e18edfe1eeb32ced2de72ed7c:RFQ-JENSA_Setpoints.snp:REA_BTS19:BEAM:A_BOOK,0,1531323944.085330133,NO_ALARM,NONE,double,"2.0",,"---",,true
bc202d5f21f9829fa3701ca636657ee1b0a73e25:RFQ-JENSA_Setpoints.snp:REA_BTS19:BEAM:A_BOOK,0,1531323944.085330133,NO_ALARM,NONE,double,"2.0",,"---",,true
etc...
不过,我希望看到类似这样的内容:
<hash>:<Retrieved A_BOOK Value>
或者,根据我刚才显示的输出,我希望看到这样的结果:
16eca44985214b790eb6ca8241ad86728b4fd3ae:2.0
6e585c905444f25e18edfe1eeb32ced2de72ed7c:2.0
bc202d5f21f9829fa3701ca636657ee1b0a73e25:2.0
etc...
并最终包含一些数学以显示更有意义的内容:
<hash>:<Retrieved Q_BOOK Value>/<Retrieved A_BOOK Value>
有没有更好的方法来解决这个问题?
检索此信息的好方法是什么?
谢谢!
鉴于您对每个修订版中的特定文件感兴趣,请考虑将 -- <pathspec>
添加到 git grep
调用中。也就是说,而不是:
git grep 'BTS19:BEAM:A_BOOK' $(git rev-list --all) | grep RFQ-JENSA_Setpoint.snp
你可以从:
开始
git grep 'BTS19:BEAM:A_BOOK' $(git rev-list --all) -- RFQ-JENSA_Setpoint.snp
您仍然会看到这些行,但速度更快,因为 git grep
可以跳过所有 没有 名称中包含 RFQ-JENSA_Setpoint.snp
的文件。 (请注意 <pathspec>
与正则表达式不同:如果您真的想允许任何字符,例如 RFQ-JENSA_SetpointXsnp
和 RFQ-JENSA_SetpointYsnp
作为文件名,您必须使用-- 'RFQ-JENSA_Setpoint?snp'
在这里。我猜你的第二个 grep 过于宽容。RE 通常比路径 glob 更具表现力,但对于这种特殊情况,即使你确实是指 "any character",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 parallel 命令。)
要分解这些并提取第 7 个逗号分隔值,请考虑将 :
替换为 ,
并使用 awk
:
... | sed 's/:/,/' | awk -F, '{print ":" }'
尽管如果您需要适当的 CSV 引用处理,单独的工具可能更合适。 (给定您的示例,这也会打印 <hash>:"2.0"
,并带有引号。)
我正在尝试过滤我的 git 存储库中文件的历史内容。某些文件中有一行包含字符串 'BEAM:A_BOOK',该行的第 7 个逗号分隔值是我要检索以进行进一步处理的值。我认为,理想情况下,我最终会得到类似字典的东西,其中包含提交的 SHA-1 哈希值,以及此文件过去版本的 A_BOOK 值。
文件前几行的示例。请注意,我希望从此版本的文件中检索到的值是“56.0”:
# Date: 2018-12-21 01:49:16.888
PV,SELECTED,TIMESTAMP,STATUS,SEVERITY,VALUE_TYPE,VALUE,READBACK,READBACK_VALUE,DELTA,READ_ONLY
REA_EXP:LINE,0,1544047322.881066957,NO_ALARM,NONE,enum,"JENSA~[UDF;AT-TPC;GPL;JENSA]",,"---",,true
REA_BTS19:BEAM:OPTICSFILE,0,1541798820.065952460,NO_ALARM,NONE,string,"BTS19_test3.data",,"---",,true
REA_BTS19:BEAM:A_BOOK,0,1545322510.562031883,NO_ALARM,NONE,double,"56.0",,"---",,true
最终,我将对其进行扩展以检索几个值并进行一些数学运算以执行更复杂的过滤。更多背景信息:我们将为核物理实验提供的离子束的原子质量和电荷值存储在版本控制下的文本文件中。这些文本文件充当我们的 'save sets',并且填充的不仅仅是这些质量和电荷信息,因为它们还包括如果我们想再次 运行 该光束我们将恢复的机器值。我的目标是通过我们 运行 与它们的光束的 Charge:Mass 比率来过滤这些文件。
到目前为止,这似乎是我的大部分信息:
git grep 'BTS19:BEAM:A_BOOK' $(git rev-list --all) | grep RFQ-JENSA_Setpoint.snp
它吐出这样的东西:
16eca44985214b790eb6ca8241ad86728b4fd3ae:RFQ-JENSA_Setpoints.snp:REA_BTS19:BEAM:A_BOOK,0,1531323944.085330133,NO_ALARM,NONE,double,"2.0",,"---",,true
6e585c905444f25e18edfe1eeb32ced2de72ed7c:RFQ-JENSA_Setpoints.snp:REA_BTS19:BEAM:A_BOOK,0,1531323944.085330133,NO_ALARM,NONE,double,"2.0",,"---",,true
bc202d5f21f9829fa3701ca636657ee1b0a73e25:RFQ-JENSA_Setpoints.snp:REA_BTS19:BEAM:A_BOOK,0,1531323944.085330133,NO_ALARM,NONE,double,"2.0",,"---",,true
etc...
不过,我希望看到类似这样的内容:
<hash>:<Retrieved A_BOOK Value>
或者,根据我刚才显示的输出,我希望看到这样的结果:
16eca44985214b790eb6ca8241ad86728b4fd3ae:2.0
6e585c905444f25e18edfe1eeb32ced2de72ed7c:2.0
bc202d5f21f9829fa3701ca636657ee1b0a73e25:2.0
etc...
并最终包含一些数学以显示更有意义的内容:
<hash>:<Retrieved Q_BOOK Value>/<Retrieved A_BOOK Value>
有没有更好的方法来解决这个问题? 检索此信息的好方法是什么?
谢谢!
鉴于您对每个修订版中的特定文件感兴趣,请考虑将 -- <pathspec>
添加到 git grep
调用中。也就是说,而不是:
git grep 'BTS19:BEAM:A_BOOK' $(git rev-list --all) | grep RFQ-JENSA_Setpoint.snp
你可以从:
开始git grep 'BTS19:BEAM:A_BOOK' $(git rev-list --all) -- RFQ-JENSA_Setpoint.snp
您仍然会看到这些行,但速度更快,因为 git grep
可以跳过所有 没有 名称中包含 RFQ-JENSA_Setpoint.snp
的文件。 (请注意 <pathspec>
与正则表达式不同:如果您真的想允许任何字符,例如 RFQ-JENSA_SetpointXsnp
和 RFQ-JENSA_SetpointYsnp
作为文件名,您必须使用-- 'RFQ-JENSA_Setpoint?snp'
在这里。我猜你的第二个 grep 过于宽容。RE 通常比路径 glob 更具表现力,但对于这种特殊情况,即使你确实是指 "any character",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 parallel 命令。)
要分解这些并提取第 7 个逗号分隔值,请考虑将 :
替换为 ,
并使用 awk
:
... | sed 's/:/,/' | awk -F, '{print ":" }'
尽管如果您需要适当的 CSV 引用处理,单独的工具可能更合适。 (给定您的示例,这也会打印 <hash>:"2.0"
,并带有引号。)