Учитывая точную строку темы фиксации, я хочу знать, содержит ли ветка фиксацию с этой темой.
Что у меня сейчас есть: git log --format = "%s" -F --grep = "$msg" "$branch" | grep -Fq --max-count=1 -- "$msg"
т.е. выполните поиск в журнале с помощью grep с фиксированной строкой и распечатайте тему. Затем найдите этот объект с той же фиксированной строкой и остановитесь на первом совпадении.
2-й grep требуется, потому что git log --grep
может найти шаблон в любом месте сообщения фиксации (например, Fixes "$msg"
)
Однако у этого есть обратная сторона: кажется, что он всегда проходит всю историю этой ветки, что занимает довольно много времени.
В качестве теста я запустил git log --format = "%s" -F --grep = "$msg" "$branch" | grep -Fq --max-count=1 -- "$msg"
и git log --format = "%s" -F --grep = "$msg" "$branch"
, и они оба заняли одинаковое время, хотя фиксация для grep для была найдена / напечатана очень быстро (для 2-го)
Итак, есть ли способ напрямую найти фиксацию в ветке по заданному субъекту (используя фиксированные строки, поскольку $msg
исходит из другой команды и может содержать символы, подобные регулярным выражениям) быстрее или, по крайней мере, ускорить выход моего log-grep-pipe (на успех)?
Я, хотя grep, сделанный git, может быть быстрее. Но, кажется, это не для случая, когда коммит найден
Попробуй это:
git log --format = "%s" "$branch" | grep -Fqx --max-count=1 -- "$msg"
Здесь x
будет соответствовать всей строке, а max-count вернет первое совпадение.
Я уже использовал --max-count=1
, но, похоже, это действительно был grep в истории git, который делал его медленным. Случай совпадения теперь почти мгновенный по сравнению с 5,5 с раньше. Случай несоответствия составляет 6,1 с против 5,4 с ранее. Таким образом, на 10% медленнее в худшем случае и очень быстро в лучшем случае.
Вы пытались удалить первый
grep
и использовать только второй для фильтрации?git log --format = "%s" "$branch" | grep -Fq --max-count=1 -- "$msg"