2009-12-21 1 views
15

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

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

журнала

мерзавец --diff-фильтр = A --pretty = короткий - Foo

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

git обвинение -C -C -f $ commit ^! - foo

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

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

ответ

10

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

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

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

Тогда:

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

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

Таким образом, первая команда (git log) поможет вам найти коммиты, которые ввели скопированные строки; второй (git blame) поможет найти источник за подозрения в совершении звонка, полученные git log.

+0

Спасибо за объяснения! Двойной флаг «-C-C» для git-вины выглядит действительно интересным –