Как найти последний тег, включающий определенный путь, но перед определенным коммитом? - PullRequest
2 голосов
/ 25 сентября 2019

Я пытаюсь написать скрипт, который генерирует журнал изменений, то есть список коммитов.Я хочу передать ему тег - или любую ссылку в этом отношении - и он должен:

  1. Из данной ссылки оглянуться назад во времени и найти первый теговый коммит, то есть последний тег перед ним..
  2. Распечатайте список коммитов между этими ссылками.

Последнее, хотя, поскольку я работаю с монорепо, содержащим много подпроектов, это также необходимо учитыватьзаданный путь, то есть отфильтровать коммиты, не включающие этот путь.

Итак, я знаю, что могу получить список коммитов между ссылками a и b, включающими path с:

git log --oneline a..b -- path

Моя конечная ссылка, b, вводится в сценарий, но мне все еще нужно выяснить мою начальную ссылку, a, и вот где я застрял.

Я знаю о git rev-list --tags --no-walk -- path, чтобы перечислить только отмеченные коммиты для данного пути, но если я также передам ссылку на коммит - чтобы получить только коммиты до этой ссылки, он не получит то, что я ожидал, вместо этого он просто включит переданную ссылку в результат,бut все еще приносит новые теги.

Предполагая, что git может сделать это самостоятельно, кто-то может указать мне правильное направление?Он не должен быть сверхпрочным, и можно предположить, что были соблюдены некоторые рекомендации в отношении фиксации тегов и тому подобного, если это поможет.

Спасибо.

1 Ответ

2 голосов
/ 25 сентября 2019

Я мог бы найти что-то, хотя это зависит от конкретного моего случая.

Так что из-за того, что это монорепо, все мои теги имеют префикс с подпроектом, на который он ссылается.Этот префикс также совпадает с путем подпроекта.Например, предположим, что подпроект живет в cool-project/super-app, поэтому все связанные с ним теги имеют префикс cool-project/super-app.

Также, понизив мой сценарий изменений, чтобы принимать только полностью сформированные теги, например cool-project/super-app/v2, теперь я могу предположить, что:

  1. Предыдущий тег также начинается с cool-project/super-app.
  2. Изменения, которые меня интересуют при ведении журнала, произошли внутри каталога cool-project/super-app.

Получив это состояние, я обнаружил, что мы можем использовать git describe, чтобы найти предыдущий тег :

git describe --tags --abbrev=0 --match "prefix/*" "tag^"

Где prefix - деконструкция моего тега (удалена часть версии), а tag - аргумент, введенный в скрипт.

Наконец, я могусоздать список коммитов между двумя тегами, относящимися к super-app с помощью:

git log previous-tag..tag -- prefix

, где previous-tag - результат последней команды, приведенной выше, и еще раз tag - аргумент, введенный вscript и prefix - деконструкция этого аргумента (часть версии удалена).

Если у кого-то есть предложения или замечания по поводу этого решения, пожалуйста, дайте мне знать.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...