Как использовать git diff -G?

Я пишу небольшой набор тестов, который запускает инструмент для тестирования на множестве входных файлов. Для каждого входного файла инструмент создает соответствующий выходной файл (оба в формате XML). Входные и выходные файлы возвращаются в репозиторий Git.

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

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

Прочитав руководство для git-diff, я обнаружил, что есть вариант -G:

-G‹regex›
Поиск различий, добавленная или удаленная строка которых соответствует заданному ‹regex›.

К сожалению, в них нет примера использования опции -G.

Моей первой мыслью было просто написать

git diff -GOutputFingerprint

но это неправильно:

> git diff -GOutputFingerprint
error: invalid option: -GOutputFingerprint

Следующей мыслью было поместить регулярное выражение в косую черту, что также не удалось:

> git diff -G/OutputFingerprint/
error: invalid option: -GC:/Program Files/Git/OutputFingerprint/

Кроме того, просто поставить пробел между -G и OutputFingerprint не получится:

> git diff -G OutputFingerprint
fatal: ambiguous argument 'OutputFingerprint': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

Когда я вызываю git diff без каких-либо параметров, я получаю модификацию:

-    <OutputFingerprint>e45807ca76fc5bb78e9e928c6fb7eed6</OutputFingerprint>
+    <OutputFingerprint>d0846851bc9d52b37f7919def78660a2</OutputFingerprint>

Еще была мысль использовать git diff -S".*OutputFingerprint.*" --pickaxe-regex, но и это не увенчалось успехом.

git --version дает мне git version 1.7.3.1.msysgit.0, если это важно.

Когда я спрашиваю git diff --help, предоставленное руководство показывает мне вариант -G.

Итак, может ли кто-нибудь привести мне пример того, как правильно использовать git diff -G?


person eckes    schedule 23.02.2011    source источник
comment
хех, у моего git 1.7.1 нет опции G -- интересно, есть ли у вас поддержка _2_? Вам может понадобиться более новая версия для поддержки того, что вы хотите сделать.   -  person sarnold    schedule 23.02.2011
comment
просто чтобы убедиться, есть ли фактические изменения, о которых нужно сообщить? Без незафиксированных изменений я получил неизвестные ошибки ревизии даже без -G... Просто убедитесь, что вы получили какой-то тип различий, прежде чем пытаться его отфильтровать.   -  person sarnold    schedule 23.02.2011
comment
Синтаксис -G у меня работает на MacOSX, версия git 1.7.4.1.   -  person sarnold    schedule 23.02.2011
comment
@eckes: я обновил свой ответ разъяснениями и примером. Для изменений достаточно простого 'git diff -G OutputFingerprint' ;)   -  person Sylvain Defresne    schedule 23.02.2011


Ответы (1)


git diff -Garegex

отлично работает с msysgit 1.7.4, но только в сеансе bash (в сеансе DOS ничего не возвращает)

Он отобразит diff, если регулярное выражение соответствует строке, добавленной или удаленной из промежуточной версии.
добавлено или удалено : не изменено.
Это означает, что в вашем случае это не сработает

OP eckes сообщает, что работает (только с msysgit1.7.4+), добавляя, что diff справочная страница для варианта -G включает:

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


Пример: я добавляю новую строку «ааа» (без git add: простое редактирование)

$ git diff -Gaaa

diff --git a/conf/fragments/xxx_repos.conf b/conf/fragments/xxx_repos.coindex 263fa85..3475f9b 100644
--- a/conf/fragments/xxx_repos.conf
+++ b/conf/fragments/xxx_repos.conf
@@ -10,3 +10,4 @@ repo xxx-sdsfwk
     RW+                                = vonc user1 user2
     RW                                 = @xxx_users
 xxx-sdsfwk "Owner" = "for..."
+aaa

Обратите внимание, что в Git 2.33 (3 квартал 2021 г.) использование --pickaxe-regex (обычно зарезервированное для -S) будет невозможно с -G (который в любом случае уже использует регулярное выражение).

Подписал: Эвар Арнфьорд Бьярмасон

pickaxe: die when -G and --pickaxe-regex are combined

Когда параметры -G и --pickaxe-regex объединяются, мы просто игнорируем параметр --pickaxe-regex.
Вместо этого давайте умрем, как предлагается в нашей документации, поскольку -G всегда является регулярным выражением.

Когда --pickaxe-regex был добавлен в d01d8c6 (поддержка кирки, соответствующей регулярным выражениям, 2006-03- 29, Git v1.3.0-rc4 -- слияние) существовала только опция -S.
Затем, когда -G был добавлен в f506b8e (git log/diff: add -G, что greps в тексте патча, 23 августа 2010 г., Git v1.7.4-rc0 -- merge) ни документация для --pickaxe-regex соответственно не обновлялась, ни что-то подобное этому утверждению не добавлялось.

Поскольку 5bc3f0b (документ diffcore-pickaxe: документ -S и -G правильно, 2013- 31 05, Git v1.8.4-rc0 -- слияние) мы заявили что --pickaxe-regex следует использовать только с -S, но молча терпели сочетание его с -G, давайте вместо этого умрем.

Попробуйте добавить пробел между

git diff -Garegex
и регулярным выражением?

person VonC    schedule 23.02.2011
comment
Указание мне на msysgit 1.7.4 было правильным путем! git diff | grep ... теперь показывает мне, что _2_ был изменен. Именно то, что мне нужно. Спасибо! - person VonC; 23.02.2011
comment
@VonC: вернуться к git diff -GOutputFingerprint было бы моей альтернативой, если бы я не мог сделать это только с помощью git. Но сейчас в этом нет необходимости... - person eckes; 23.02.2011
comment
@eckes: даже лучше, чем я думал. Отлично. - person eckes; 23.02.2011
comment
@VonC: Я думаю, вы неправильно истолковали документы, когда думали, что это не сработает: очевидно, Ищите различия, добавленная или удаленная строка которых соответствует заданному регулярному выражению, относится к выводу различий, где измененная строка печатается как одна добавленная и одна удаленная строка... - person VonC; 23.02.2011