git: определить все коммиты, не соответствующие шаблону

Я пытаюсь идентифицировать все коммиты с помощью сообщения, которое не начинается с [core], Это мои неудачные попытки:

  1. Простой подход

    git rev-list --grep '^(?!(\[core\]).).+' "branch1...branch2"
    
    • пустой результат
  2. Включить расширенный флаг

    git rev-list -E --grep '^(?!(\[core\]).).+' "branch1...branch2"
    
    • Сообщение об ошибке fatal: command line, '^(?!(\[core\]).).+': Invalid preceding regular expression,

    • Похоже, что git grep не поддерживает отрицательный прогноз.

  3. Сравнение списка всех коммитов со списком тех, у кого есть тег ( см. Этот ответ):

    git rev-list "branch1...branch2" | grep -Fxv <(git rev-list -E --grep '^\[core\].+' "branch1...branch2")
    
    • Результаты в sh: syntax error near unexpected token `('

PS: я не могу перейти на Git 2.x, поэтому --invert-grep это не вариант

2 ответа

Нечто подобное может сработать.

git rev-list "branch1...branch2" --not $(git rev-list --grep '^\[core\]')

Выберите ревизии в этом списке, которые соответствуют шаблону, который вам не нужен, а затем используйте --not чтобы отменить этот список изменений в другом вызове rev-list,

Вы также можете избежать замены процесса в третьей попытке, используя настоящий файл, подобный этому:

git rev-list -E --grep '^\[core\].+' "branch1...branch2" > core.list
git rev-list "branch1...branch2" | grep -Fxvf core.list

Если это соответствует вашим требованиям для использования командного файла, это одно из решений:

#!/bin/sh
range="branch1...branch2"
validCommits=`git rev-list -E --grep '^\[core\]' "$range"`
badCommits=`git rev-list "$range" | grep -Fxv "$validCommits"`
Другие вопросы по тегам