Поиск конкретного 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 г.)

фиксацию b0c42a5list-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)'исключает все объекты, не относящиеся к запрашиваемому типу.

А также:

Фиксацию 9cf68b2rev-list: разрешить фильтрацию предоставленных товаров

Подписано: Патрик Стейнхардт

При предоставлении фильтра объектов в настоящее время невозможно также фильтровать предоставленные элементы.
Например,
при выполненииgit rev-list( мужчинаman ) HEAD, фиксация, к которой относятся эти контрольные точки, будет рассматриваться как предоставленная пользователем и, таким образом, исключена из механизма фильтрации.
Это затрудняет правильное использование нового --filter=object:type filter, учитывая, что даже если пользователь хочет видеть только капли, он все равно будет видеть фиксации предоставленных ссылок.

Улучшите это, добавив новую опцию в команду git-rev-parse(1).
Если указано, то все предоставленные пользователем ссылки будут подвергаться фильтрации.

rev-list-optionsтеперь включает в свою справочную страницу :

--filter-provided-objects

Отфильтруйте список явно предоставленных объектов, которые в противном случае всегда печатались бы, даже если бы они не соответствовали ни одному из фильтров. Полезно только с --filter=.

Другие вопросы по тегам