Git Diff на уровне метода - PullRequest
       27

Git Diff на уровне метода

2 голосов
/ 04 марта 2020

Я ищу информацию о всех методах / функциях Добавлено, удалено и изменено между любыми двумя коммитами

Примечания -

  1. База кода находится в Java и на Github

  2. Цель Utlimate - я должен иметь возможность получить все Удаленные, Модифицированные (Оба модификация исходного кода и переименование методов) и вновь добавленные методы между любыми двумя коммитами, охватывающими подпакеты и классы

  3. Более приятно, если возвращается полная сигнатура метода вместе с полное имя метода

Вещи, которые я пытался

  1. git Diff - Ссылка - но история Diff огромна, и меня действительно интересуют только изменения методов, добавленных, удаленных или измененных (ie в Java перечисляет класс, но не функцию)

  2. git log -L :function:path/to/file - печатает историю изменений этой функции, не выполняет то, что я намерен делать, и наблюдатели для определенной функции c, но не для всего репо git. Другое ограничение заключается в получении diff между двумя коммитами.

Желаемые результаты

Разница между любыми двумя коммитами должна возвращать

Methods Added -> 
        myMethod12 - path/to/class
        myMethod34 - path/to/class

Methods Deleted -> 
        myMethod3 - path/to/class
        myMethod11 - path/to/class

Methods Renamed ->
        (Previous Name)  (Revised Name)  (Path)
        myMethod6        yourMethod32    path/to/class

Methods Modified (source code modifs) ->
        myMethod44 - path/to/class

или в идеале полное имя метода

ie

Methods Added ->
       com.example.subp.subp2.nestedpack.addMessages(Message[] msgs)
...

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Git - это общий инструмент. Он не понимает ваш исходный язык (в данном случае Java, но что если ваш исходный язык был бы вместо Swift или Python или C ++ или TypeScript или, ну, что еще вы можете придумать?). Он просто понимает «строки текста» и имеет простые (а иногда и не очень простые) регулярные выражения для распознавания функции / метода / класса / других подобных определений, для аннотирования различий. 1

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

Учитывая такой инструмент, вы дадите ему:

  • более старая версия (коммит или файл из этого коммита) и
  • более новая версия (другой коммит или "тот же" файл из этого коммита).

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

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

Команда git difftool может быть полезной или полезной для вызова этого другой инструмент. Что делает git difftool, так это сравнивает две полные фиксации, а затем для каждого отличающегося файла передает старую и новую версии этих файлов другому инструменту. Вы выбираете этот второй инструмент из любого инструмента на вашем компьютере, где угодно. Git просто вызывает этот инструмент на паре файлов, извлеченных из пары коммитов. Если это делает то, что вам нужно, теперь вы сделали. Если нет, вам может потребоваться еще несколько шагов: например, вы можете запустить git diff --raw <commit1> <commit2> и проанализировать его вывод, или просто git checkout каждый из двух коммитов в некоторые временные местоположения (используя временный индекс для каждого) и работать оттуда.


1 Обратите внимание, что регулярные выражения не способны к правильному анализу; большинство реальных языков требуют грамматики. Смотрите, например, Регулярное выражение против. Разбор строки . Правильное обсуждение CS-теоремы c войдет в Автоматы конечного состояния , но в StackOverflow обычно не работает topi c.

0 голосов
/ 04 марта 2020

Прежде всего, git работает с текстом и не отвечает за индексацию ваших источников, поиск определений методов и т. Д. c.

Так что, вероятно, лучшее решение - diff . Здесь описано, как использовать diff между указанными c коммитами.

От себя я хотел бы призвать вас использовать diff для указанного c файла: git diff specific-file и использовать grep если разница велика:

git diff | grep -e method-name -e public -e private -e void -e etc

Я надеюсь, что вы придумаете более подходящую команду для ваших целей. Удачи!

...