Я следил за этим сообщением и хочу получить все строки код, который был изменен, кроме комментариев! ,

Примеры комментариев, которые я хочу проигнорировать:

* @copyright Copyright (c) 2006-2017 X.commerce, Inc. and affiliates (http://www.magento.com)

Был изменен на:

* @copyright Copyright (c) 2006-2018 Magento, Inc. (http://www.magento.com)

Используя эту команду:

`git diff -G [^* @copyright] > diff.txt` , it outputs:
fatal: ambiguous argument '@copyright]': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Как я могу получить список файлов, в которых были изменены другие части кода, а не только часть copyright? Спасибо

git
0
Attila Naghi 19 Сен 2018 в 11:29

2 ответа

Лучший ответ

TL; DR: -G не совсем то, что вы хотите, но посмотрите Регулярное выражение, соответствующее строке, которая не содержать слово? и обратите внимание, что -G использует синтаксис "расширенного регулярного выражения" POSIX.

Долго

Вам нужно решить две разные проблемы (плюс некоторая бесполезная документация от Git). Одна из этих проблем - написать регулярное выражение, которое выбирает то, что вам нужно. Ответ RomainVALERI нацелен на это (но, к сожалению, пропускает), игнорируя другую проблему: -G не будет вполне делай что хочешь. Позвольте мне сначала заняться этим.

Команды git diff и git log (которые полностью представляют собой разные команды) имеют общий исходный код и некоторую документацию. И -G, и -S активируют то, что Git называет киркой , что задокументировано на отдельной странице под названием gitdiffcore.

Когда мы запускаем git log, у нас возникает общая проблема: он показывает нам слишком много коммитов. Мы хотим видеть меньше коммитов! В частности, мы хотим видеть коммиты, которые повлияли на определенные части нашего кода. Вот где -G и -S наиболее полезны: git log -G<regex> или git log -S<text> найдите коммиты, где, если мы запустим git show на эти коммиты, мы увидим изменение, которое повлияет на код, который мы просили найти.

Помните, что git show <hash> в большей или меньшей степени запускает git diff <hash>^ <hash>, чтобы сравнить снимок в родительском элементе одной конкретной фиксации с моментальным снимком в дочернем. То есть каждая фиксация сохраняет полный снимок, поэтому, сравнивая то, что находится в родительском элементе с тем, что находится в дочернем , мы можем узнать, что изменилось в этом коммите. 1 Как только мы узнаем, что изменилось , мы можем искать в нем какое-то конкретное изменение.

Итак, вернемся ненадолго к git log: мы могли бы захотеть узнать, какие коммиты изменили дату авторских прав, чтобы увидеть, изменили ли они что-нибудь еще. Таким образом, мы должны git log -S или git log -G найти и перечислить / показать все коммиты , у которых есть строка, содержащая слово copyright в их различиях . Вот для чего эти варианты особенно хороши. Но это не то, что вы пытаетесь сделать.


1 Это немного похоже на просмотр графика высокой температуры каждый день за последнюю неделю и выяснение, в какой день температура изменилась больше всего: мы должны вычесть день -пар ; знание того, что было 24 ° C в понедельник и 18 ° C в среду, ничего не говорит нам о том, что было во вторник, но если во вторник было 19 ° C, сейчас мы знаем, что оно изменилось к 5 с понедельника на Вт, а затем в 1 со вторника по ср. Точно так же со снимками исходного кода мы должны вычесть снимок понедельника из снимка вторника, чтобы увидеть, что изменилось во вторник. Мы должны вычесть вторник из среды, чтобы увидеть, что изменилось в среду.


Теперь, когда мы запускаем git diff для любых двух конкретных коммитов , например:

git diff <old-commit> <new-commit>

Git эффективно вычитает старую фиксацию из новой фиксации, чтобы сообщить нам, в чем разница. Но фиксация состоит из файлов . В каждом из двух коммитов может быть 10 000 файлов. Разница покажет нам, что изменилось в каждом файле, и это может быть 1% файлов или 100 файлов, но нас могут интересовать только файлы , в которых разница содержит слово "авторское право" , например.

Вот что делает кирка (-G или -S) при использовании с git diff: если git diff должен показать нам 100 файлов с различиями , кирка выбирает только те файлы, которые содержат конкретное изменение, которое мы просим ее искать . Итак, если бы git diff показал нам 100 файлов, но только десять файлов содержали слово "авторское право" в выводе результатов сравнения, git diff -G copyright <old> <new> показал бы нам эти десять файлов .

В вашем случае, как только вы придумаете регулярное выражение, которое соответствует вещам, которые не "авторские права", у вас есть способ сообщить Git: Найти различия, которые изменили что-то кроме текста после слово "авторское право". Если вы используете его с git diff, это покажет вам полное различие - включая изменение авторских прав! - файлов, которые изменили строку, не содержит слова «авторское право».

Это не то, что вы сказали, что хотели. Однако, возможно, он должен быть достаточно хорошим, потому что Git может вам это дать.

Теперь давайте вернемся к поиску строки, содержащей изменение, которое не содержит слово «@copyright», возможно, после буквальной звездочки и пробела. Это сложнее, чем кажется! Я передам это существующему вопросу в arena и множество ответов на него: Регулярное выражение для соответствия строке, не содержащей слова? Git использует POSIX < em> расширенные регулярные выражения или ERE. Они не имеют отрицательного обзора, поэтому метод в первом комментарии или этот ответ выполнит свою работу, но принятый ответ - нет.

1
torek 19 Сен 2018 в 16:45

Пытаться

git diff -G"(^\\\* @copyright)"

Когда строка анализируется на предмет регулярного выражения, \\ становится единичным \, а \* становится *.

0
RomainValeri 19 Сен 2018 в 09:20