git: определить все коммиты, не соответствующие шаблону
Я пытаюсь идентифицировать все коммиты с помощью сообщения, которое не начинается с [core]
, Это мои неудачные попытки:
Простой подход
git rev-list --grep '^(?!(\[core\]).).+' "branch1...branch2"
- пустой результат
Включить расширенный флаг
git rev-list -E --grep '^(?!(\[core\]).).+' "branch1...branch2"
Сообщение об ошибке
fatal: command line, '^(?!(\[core\]).).+': Invalid preceding regular expression
,Похоже, что git grep не поддерживает отрицательный прогноз.
Сравнение списка всех коммитов со списком тех, у кого есть тег ( см. Этот ответ):
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"`