Что такое 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 работает с парами коммитов).

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