Как определить код и вложенный код с помощью git?

Я еще раз прочитал страницу git-blame и заметил эту часть:

Особенно полезным способом является просмотр, если добавленный файл имеет строки, созданные путем копирования и вставки из существующих файлов. Иногда это указывает на то, что разработчик был неаккуратным и не реорганизовал код должным образом. Сначала вы можете найти фиксацию, которая ввела файл:

git log --diff-filter = A --pretty = short-foo

а затем аннотировать изменение между фиксацией и ее родителями, используя commit ^! Обозначения:

git винить -C -C -f $commit ^! - foo

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

Может ли какой-нибудь эксперт git объяснить, как использовать вышеприведенные команды git, и можно ли использовать что-то подобное, чтобы сделать git показать, есть ли дублирование кода (возможно, используя индекс "подобия" ', который git, кажется, вычисляется при переименовании файлов)?

Ответы

Ответ 1

Вы можете разбить команды отдельно.

$ git log --diff-filter=A --pretty=short -- foo

отображает журнал для файла "foo". Опция --diff-filter показывает только фиксации, в которые были добавлены файлы ( "A" ), и показывает ее в сжатом формате (опция --pretty=short). (-- является стандартом для высказывания "ничто, что следует за этим вариантом", и все после этого - список имен файлов, на которые должен применяться журнал).

Тогда:

$ git blame -C -C -f $commit^! -- foo

git blame аннотирует каждую строку файла информацией из последней фиксации. Параметр double -C -C агрессивно проверяет строки, которые были скопированы из других файлов. Параметр -f показывает имя файла первоначальной фиксации (что означает, что если строка была скопирована из другого файла, вы увидите имя файла, из которого он был скопирован). $commit^! - обозначение для $commit; суффикс ^! означает исключение всех родившихся $commit.

Таким образом, первая команда (git log) помогает вам найти коммиты, которые ввели скопированные строки; второй (git blame) помогает найти источник любых подозрительных коммитов, возвращаемых git log.