Ответ 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
.