Поиск и обработка объектов git - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь отфильтровать историческое содержимое файла в моем git-репозитории.В некоторых файлах есть строка, содержащая строку «BEAM: A_BOOK», а в седьмом запятом значение этой строки - это значение, которое я хочу получить для дальнейшей обработки.Я думаю, в идеале, я бы хотел получить что-то вроде словаря с хэшем 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

В конечном счете, я расширю это, чтобы получить значения пары и сделать некоторую математику для выполнения более сложной фильтрации.Дополнительные сведения: мы храним значения атомной массы и заряда для ионных пучков, которые мы предоставляем для экспериментов по ядерной физике, в текстовых файлах под контролем версий.Эти текстовые файлы действуют как наши «наборы сохранения», и в них содержится больше информации о массе и заряде, поскольку они также включают в себя машинные значения, которые мы восстановили бы, если бы хотели снова запустить этот луч.Моя цель состоит в том, чтобы отфильтровать эти файлы по соотношению Заряд: Масса лучей, с которыми мы с ними работали.

Пока что мне кажется, что это большая часть моей информации:

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>

Есть лилучший способ пойти об этом?Какой хороший способ получить эту информацию?

Спасибо!

1 Ответ

0 голосов
/ 28 декабря 2018

Учитывая, что вас интересует определенный файл в каждой ревизии, рассмотрите возможность добавления -- <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'. IПолагаю, ваш второй grep был чрезмерно разрешительным. RE в целом более выразительны, чем глобусы путей, но для этого конкретного случая, даже если вы действительно имели в виду «любой символ», 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 .)

Чтобы разбить их и извлечьСедьмое значение, разделенное запятыми, рассмотрите возможность замены : на , и использования awk:

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

, хотя, если вам нужна правильная обработка кавычек CSV, вероятно, более подходящим является отдельный инструмент.(Учитывая ваш пример, это напечатало бы <hash>:"2.0" тоже с кавычками.)

...