Что такое Git-эквивалент Mercurial Revsets?
В Mercurial есть домен-специфический язык, называемый revsets, который позволяет пользователям указывать наборы ревизий.
Например, вы можете перечислить патчи, которые еще не были объединены в ветке default
:
hg log -r "all() - ancestors('default')"
В качестве более сложного примера приведенная выше ссылка дает пример перечисления наборов изменений между тегами ревизии. 1.3
и ревизия помечена 1.5
которые упоминают "ошибку" и влияют на файл в каталоге hgext
:
hg log -r "1.3::1.5 and keyword(bug) and file('hgext/*')"
Язык revset достаточно богат, что позволяет выбирать наборы изменений на основе дат, имени пользователя, сообщения о фиксации, наличия фиксации в определенном удаленном местоположении и т. Д.
Есть ли в git эквивалентный механизм для запроса наборов изменений, либо в основной программе, либо в виде расширения?
3 ответа
The git-branchless
набор инструментов теперь включает язык, похожий на revset, под командойgit branchless query
.
После установки и инициализации в текущем репозитории примеры из предыдущего вопроса (восемь лет назад!) можно запрашивать следующим образом:
# List patches not yet been merged into the branch default:
git branchless query "all() - ancestors('default')"
# List patches between the revision tagged 1.3 and the revision tagged
# 1.5 which which mention "bug" and affect a file in the directory hgext
git branchless query "1.3::1.5 and message('bug') and paths.changed('glob:hgext/*')"
Они удивительно похожи на свои эквиваленты HG.
Чтобы вывести список всех коммитов, кроме основной ветки по умолчанию, как я полагаю, первый пример делает:
git log --all --not master
Чтобы получить результат, примерно равный второму примеру:
git log 1.3...1.5 --grep="bug" -- hgext
Есть ли в git эквивалентный механизм для запроса ревизий в основной программе или в виде расширения?
Ближайший эквивалент в git - gitrevisions(7)
, но он полностью спроектирован, значительно менее регулярен и менее компонован. И не все команды его используют (как известно, есть идентичные конструкции, которые ведут себя совершенно по-разному, потому что
gitrevisions
работает на диапазонах, но
git diff
работает с парами коммитов).