2016-11-11 2 views
1

Предположим, что у меня есть ветка с 3 коммитами, комментарии - t123, b1 и b12 отдельно.как искать git log без определенного фиксации

* b90b03f (HEAD -> master) b12 
* 27f7577 b1 
* 7268b40 t123 

А теперь, я хочу использовать git log --grep <regex> искать журнал журнала без T123. В результате я хочу

* b90b03f b12 
* 27f7577 b1 

Так как я использую регулярное выражение для удовлетворения требования?

+0

add '--invert-grep' – ElpieKay

ответ

2

Это похоже на то, что вы хотите, чтобы включить все совершает, чьи фиксации сообщения не матч какой-то шаблон, но --grep включает в себя обязательство, что сделать матч какой-то шаблон. Но ответ на вопрос «как написать регулярное выражение, которое соответствует всем , кроме какой-то шаблон»: это не так.

Вам не нужно, потому что вы можете использовать что-то другое (или, точнее, что-то дополнительное), чтобы исключить фиксации со строкой «T123» в нем. В частности, если вы посмотрите на the documentation for git log, вы увидите, что он не только имеет свой --grep=<pattern> вариант, но и --invert-grep вариант:

--invert-grep
            Ограничить коммиты выход на них с журнального сообщения которые не соответствуют схеме, указанной в --grep=<pattern>.

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

git log --grep t123 --invert-grep 

будет выполнять эту работу. (The = между --grep и <pattern> части не является обязательным для --grep.)


Это, в некотором смысле, не невозможно; это просто слишком сложно, неэффективно и, самое главное, ненужно.

+0

Да, это действительно эффективно работает, спасибо! –

+0

Если у вас есть такая же проблема в другом контексте, вы можете написать инвертированное выражение, например: '[^ t] | t [^ 1] | t1 [^ 2] | t12 [^ 3]', это будет соответствовать чему угодно, кроме 't123' – lmcarreiro

+1

@lmcarreiro: это не совсем работает, потому что если у нас есть' foo t123', то альтернатива '[^ t]' будет соответствовать 'f'. На самом деле, если у нас есть только 't123' и регулярный поиск-выражение для этого, он будет соответствовать, потому что' [^ t] 'соответствует' 1'! Для выполнения этой работы вам понадобится * anchered * regexp - или, опять же, просто упростить всю проблему с помощью инверсии (вот почему 'grep' имеет' -v', например). – torek