Разберите историю git и сопоставьте ее с образцом, как только совпадение будет найдено, зафиксируйте в переменной значение поблизости - PullRequest
1 голос
/ 14 июля 2020

У меня длинная git история, и я хочу найти первый экземпляр «build (mariadbstuff): Copybara import», а затем зафиксировать связанный с ним GitOrigin-RevId «d7b349b6b6db24047ae32a1618dd5f5544864225» в переменной.

У меня есть действительно хакерский, уродливый способ сделать это, и я надеюсь на более чистый способ. Это правильный, но хакерский и уродливый bash cmd, который выполняет свою работу (хотя он не удаляет часть GitOriginRevId):

sed -e '/build(mariadbstuff)/,/GitOriginRevId/!d' <(git log) > outputfile.txt && sed -n 11p outputfile.txt
... // more contents of git history
 
build(mariadbstuff): Copybara import
    
    Squashed commit of the following:
    
    commit d8829cc7df7a6813f93d224916b10e7c148950be
    Author: Copybara <blah-tools@blah.com>
    Date:   Fri Jul 10 10:26:41 2020 -0400
    
        Project import generated by Copybara.
    
        GitOrigin-RevId: d7b349b6b6db24047ae32a1618dd5f5544864225

... // more contents of git history

Ответы [ 3 ]

4 голосов
/ 14 июля 2020

Не могли бы вы попробовать следовать, написано и протестировано с показанными образцами в GNU awk. Это решение закрывает Input_file как можно скорее, оно получает идентификатор, необходимый OP, и НЕ будет читать весь Input_file, что будет быстрее, чем чтение всего решения Input_file.

awk '
/build\(mariadbstuff\): Copybara/{
  found=1
  next
}
found && /GitOrigin-RevId:/{
  print $NF
  exit
}
'  Input_file

Explanation: Добавление подробного объяснения вышеизложенного.

awk '                                    ##Starting awk program from here.
/build\(mariadbstuff\): Copybara/{       ##Checking condition if a line contains string build\(mariadbstuff\): Copybara escaping ( and ) in it to treat it as literal character here.
  found=1                                ##Setting found variable to 1 here.
  next                                   ##next will skip all further statements from here.
}
found && /GitOrigin-RevId:/{             ##Checking condition if found is SET and line has string GitOrigin-RevId: then do following.
  print $NF                              ##Printing last column of current line here.
  exit                                   ##exiting from program from here to save sometime :)
}
'  Input_file                            ##Mentioning Input_file name here.
2 голосов
/ 14 июля 2020

Если мы предполагаем, что вам всегда нужно 11 строк вывода, вы можете использовать grep:

grep -m1 -A11 'build(mariadbstuff): Copybara import' <(git log)

From grep --help:

-m, --max-count=NUM       stop after NUM matches
-A, --after-context=NUM   print NUM lines of trailing context

Если мы всегда хотим остановиться на GitOrigin-RevId, то grep все еще работает, но я не думаю, что он менее хакерский, чем то, что вы уже делаете:

grep -m1 -A20 'build(mariadbstuff): Copybara import' <(git log) \
    | | grep -m1 -B20 'GitOrigin-RevId'

UPDATE

Хорошо , Это даст вам строку GitOrigin-RevId и используйте awk для получения фактического идентификатора:

revid=$(grep -m1 -A20 'build(mariadbstuff): Copybara import' <(git log) \
    | grep -m1 'GitOrigin-RevId' \
    | awk '{print $2}'
1 голос
/ 14 июля 2020

git log имеет встроенные функции поиска, которые будут быстрее, чем использование внешнего инструмента поиска. Используйте git log --grep, чтобы отображать только совпадающие сообщения фиксации. Он покажет все сообщение. Найдите это для GitOrigin-RevId, используя grep.

git log --grep='build(mariadbstuff): Copybara import' | grep GitOrigin-RevId
        GitOrigin-RevId: d7b349b6b6db24047ae32a1618dd5f5544864225

Но если это разовый, используйте свой пейджер . Предположим, что это less ...

Выполнить git log.

Нажмите /, чтобы войти в режим поиска.

Введите (или paste) build(mariadbstuff): Copybara import и нажмите return.

Он перейдет к первому совпадению.

Нажмите /, чтобы снова войти в режим поиска.

Введите GitOrigin-RevId и нажмите return.

/ выполняет поиск вперед от текущего местоположения, поэтому он перейдет к связанному GitOrigin-RevId.

...