Как я могу обнаружить скопированный и вставленный код, используя git? - PullRequest
15 голосов
/ 21 декабря 2009

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

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

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

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

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

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

Может ли какой-нибудь эксперт по git объяснить эффект совместного использования вышеуказанных команд git, и можно ли использовать что-то подобное, чтобы git показывал, есть ли дублирование кода (возможно, с помощью «индекса сходства», который, как кажется, вычисляет git). при переименовании файлов)?

1 Ответ

10 голосов
/ 21 декабря 2009

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

$ 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.

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