Поиск конкретного git commit по сообщению commit и исключение веток
В настоящее время я работаю над программой для фильтрации медленных запросов БД, которые хранятся в базе данных в командной строке.
Я хотел бы найти все коммиты во всех ветвях, кроме указанного, и вернуть все коммиты, которые совпадают.
Мои условия фильтрации хранятся в базе данных (которая предоставлена для меня).
Пример:
У меня есть следующая запись в базе данных:
ID key Query
1 ABCDEF select * from example
2 0ABCDE select * from another_example
3 1ABCDE select * from you_get_the_picture
Теперь меня интересуют запросы, которые еще не были исправлены в коде. Поэтому мне нужно искать по веткам с ключом в качестве поискового фильтра.
Если ключ найден в коммите, пропустите и найдите следующий. Если совпадений не найдено, выведите его на стандартный вывод. Весь код работает нормально, но у меня проблемы с поиском правильной команды git.
У меня есть следующее:
git grep 'ABCDEF' $(git rev-list ^origin/master) | xargs git show -s --format=%N%s
Который должен возвращать все коммиты, содержащие "ABCDEF" в сообщении коммита во всех ветвях, кроме origin / master.
Однако команда git не возвращает ничего, что невозможно, так как я знаю, что эти коммиты есть.
Не верна ли моя команда git? Заранее спасибо за любые указатели.
2 ответа
Это не то, что вы хотите:
$ git rev-list ^origin/master
$
Вы спрашивали git rev-list
чтобы исключить все обороты, достижимые из origin/master
и ничего не включать, поэтому ничего не производит.
Это может быть то, что вы имели в виду:
$ git rev-list --branches ^origin/master
c2eb39026567499ba9fe0c679766c370462ae26f
Или вы можете захотеть --tags
и / или --remotes
так же или вместо; или даже --all
хотя это включает в себя ссылки, такие как refs/stash
,
Конечно, это идет внутри git grep
зафиксировать аргументы, как вы показали в своем примере кода; это должно работать оттуда - за исключением того, что git grep
создает совпадающие строки, а не идентификаторы фиксации.
Теперь у вас есть (май 2021 года, семь лет спустя) гораздо более точный механизм фильтрации с Git 2.32 (второй квартал 2021 года): "" ( ) изучает
--filter=object:type=<type>
опция, с помощью которой можно исключить объекты данного типа из файла пакета, сгенерированного pack-объектами.
См. , фиксацию 169a15e, фиксацию 7ab6aaf, (19 апреля 2021 г.), фиксацию 9a2a4f9 (12 апреля 2021 г.) и фиксацию 628d81b , фиксацию b2025da , фиксацию a812789 (9 апреля 2021 г.) Патрика Стейнхардта (
pks-t
).
(Слияние Junio C Hamano -
gitster
- в коммите 8585d6c , 07 мая 2021 г.)
фиксацию b0c42a5
list-objects
: реализовать фильтр типа объектаПодписано: Патрик Стейнхардт
Хотя уже можно фильтровать объекты по некоторым критериям, пока невозможно отфильтровать только объекты определенного типа.
Это делает некоторые фильтры менее полезными.
Например, фильтр фильтрует большие двоичные объекты так, что возвращаются только те, которые меньше заданного предела.
Но просить только об этих маленьких каплях не стоит, учитывая, чтоgit-rev-list
продолжит печатать теги, коммиты и деревья.Теперь, когда у нас есть инфраструктура для фильтрации тегов и коммитов, мы можем улучшить эту ситуацию, реализовав новый фильтр, который выбирает объекты на основе их типа.
Таким образом, вышеуказанный запрос можно легко реализовать с помощью следующей команды:$ git rev-list --objects --filter=object:type=blob \ --filter=blob:limit=200
Кроме того, этот фильтр позволяет оптимизировать для некоторых других случаев: если, например, были выбраны только теги или коммиты, нет необходимости спускаться по деревьям.
Новый фильтр пока не поддерживается в растровых изображениях.
Это будет реализовано в следующем коммите.
git config
теперь включает в свою справочную страницу :
blob:limit
,object:type
,tree
,sparse:oid
, или же . При использовании комбинированных фильтров обаcombine
и все типы вложенных фильтров должны быть разрешены. По умолчаниюuploadpackfilter.allow
.
теперь включает в свою справочную страницу :
Форма '
--filter=object:type=(tag|commit|tree|blob)
'исключает все объекты, не относящиеся к запрашиваемому типу.
А также:
Фиксацию 9cf68b2
rev-list
: разрешить фильтрацию предоставленных товаровПодписано: Патрик Стейнхардт
При предоставлении фильтра объектов в настоящее время невозможно также фильтровать предоставленные элементы.
Например,
при выполненииgit rev-list
( мужчинаman ) HEAD, фиксация, к которой относятся эти контрольные точки, будет рассматриваться как предоставленная пользователем и, таким образом, исключена из механизма фильтрации.
Это затрудняет правильное использование нового--filter=object:type
filter, учитывая, что даже если пользователь хочет видеть только капли, он все равно будет видеть фиксации предоставленных ссылок.Улучшите это, добавив новую опцию в команду git-rev-parse(1).
Если указано, то все предоставленные пользователем ссылки будут подвергаться фильтрации.
rev-list-options
теперь включает в свою справочную страницу :
--filter-provided-objects
Отфильтруйте список явно предоставленных объектов, которые в противном случае всегда печатались бы, даже если бы они не соответствовали ни одному из фильтров. Полезно только с
--filter=
.