Как перенести объявление функции в другой файл, но сохраните Git историю?

Я рефакторинг однофайлового PHP script, чтобы объявлять функции и классы в отдельных файлах. Как перемещать блок кода из одного файла в другой файл, но сохранить историю Git для каждой отдельной строки? Я хотел бы использовать как минимум git blame код, Также будет полезно сравнение с более старыми версиями.

Обратите внимание, что меня не интересуют решения "обходного пути", которые потребуют дополнительных команд или флагов (например, --follow) в коде для просмотра его "старой" истории, для которой человек, просматривающий историю, должен знать что файл нуждается в специальном лечении. Я ищу решение, которое записывает необходимые метаданные, такие как обычные Git команды, такие как blame, log, diff и такая "просто работа", не представляя им дополнительные флаги или аргументы.

Я прочитал довольно несколько сообщения ищет решения для подобных проблем, но ни один из них не затрагивает проблему git blame для отдельных строк. Одним из решений, которое, как я думаю, будет работать, будет скопировать файл и всю его историю, тогда отработайте это. Однако этот вопрос остается без удовлетворительного ответа.

Ответ 1

Предупреждение. Предполагается, что переписывание истории является приемлемым. Не используйте это, если не знаете о последствиях переписывания истории.

Чтобы разбить файл на несколько файлов при сохранении истории использования git filter-branch:

git filter-branch --tree-filter 'if [ -f original.php ]; then 
    echo part1.php part2.php part3.php | xargs -n 1 cp original.php; fi' HEAD

Затем удалите строки, которые вы не хотите из каждого файла (оставив только нужные функции и классы) и зафиксируйте результат!