Как уменьшить выход git grep - PullRequest
       1

Как уменьшить выход git grep

0 голосов
/ 15 октября 2018

Я ищу в репозитории с помощью git grep следующим образом:

git rev-list --all | xargs git grep -lP --no-index regexp

Я ожидал, что в выводе будут только ревизии файлов, которые соответствуют выражению регулярного выражения, ноЯ получаю все ревизии, даже ту, в которой соответствующие файлы не были изменены.Например, есть файл с именем README.md, и он был изменен дважды в 1 и 4 ревизиях.Однако, когда я выполнял поиск по git grep , я также получал ревизии 2 и 3, где README.md не был изменен.

Я пытался найти некоторые варианты git grep Команда, чтобы сделать то, что я хочу, но ничего не нашел.

Очень ценю любую помощь!

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Вам еще предстоит ответить на комментарий meagar , но в любом случае стоит отметить несколько вещей:

  • Каждый коммит представляет собой полный снимок всего источника.То есть каждый коммит содержит полное дерево всех файлов.Кто-то побежал git commit;это заморозило все файлы в той форме, в которой они находились в то время.Это стало моментальным снимком коммита.

  • Запуск git grep позволяет Git выполнять поиск по некоторым видам дерева (ей) файлов, ища файлы, содержащие регулярные выражения.

Предоставляя git grep список коммитов, вы говорите ему найти каждое совпадение в каждом файле каждого такого дерева.Так что конечно если коммиты A, B и C содержат совпадающие файлы, Git расскажет вам о файлах в A, B и C.


Возможно, ваша цельвзять каждую пару коммитов и что-то с ними сделать.Например, предположим, что в репозитории ровно три коммита без слияния: A, B и C:

A  <-B  <-C   <--master

Коммит A не имеет родителя (это корневой коммит),поэтому в целях сопряжения Git вставит пустой коммит - тот, у которого нет файлов - перед A.Мы можем назвать это ε.Затем мы можем сравнить Git:

  • ε против A: все файлы добавлены
  • A против B: некоторые файлы изменены
  • B против C: некоторые файлы изменены

Мы могли бы сделать это вручную, по одной паре за раз, но есть способ автоматизировать это: git log -p делает это.В каждом из этих наборов изменений будет показано несколько строк некоторых файлов.Мы также можем git log искать этих наборов изменений, используя git log -S или git log -G.

Эти два поиска - -S и -G - похожи,но не идентичны.-G принимает обычное регулярное выражение (а-ля git grep);-S принимает строку по умолчанию, но можно сказать, что ее аргумент является регулярным выражением с использованием --pickaxe-regex.

В общем, оба сообщают git log, что она должна показывать commit (вообще), если change-set содержит данное выражение (но см. следующий бит).Поэтому вы можете пропустить -p, если вы просто заинтересованы в коммите.Если вы хотите увидеть изменения, сделанные на , которые фиксируют, включите -p:

git log -p -G regex

Другое различие между -S и -G, кроме этого -Sпринимает строку по умолчанию, -S просматривает count из вхождений совпадений.Следовательно, если вы ищете определенное слово, и патч изменяет строку, которая содержит слово, но не добавляет или удалить слово, -Gпокажет коммит, в то время как -S не будет.


Если вы пытаетесь увидеть, кто заставил какую-то определенную строку (и) какого-то конкретного файла (ов) выглядеть так, как они, git diff не правильный инструмент, но git grep и git log тоже не правы.Вместо этого используйте git annotate или git blame (это по сути одна и та же команда; см. документацию git annotate ).

0 голосов
/ 15 октября 2018
git log -p -G regexp

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

Вы также можете использовать git log --cc -G regexp и, возможно, следует противЯ привык к тому, что технически это «патч».Они отличаются незначительно.

и, как правило, я использую | grep -C 6 '^commit', если меня интересуют только имена файлов и версии коммита.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...