Вы, кажется, заинтересованы в отслеживании происхождения, проблема отслеживания, откуда появилась линия.
В идеале вы должны дать редактору возможность вспомнить, как все было отредактировано, и сохранить изменения с текстом в своем хранилище, что позволит решить проблему тривиально, но никто из нас, инженеров-программистов, не настолько умен, чтобы реализовать этот простой идея.
В качестве слабой замены можно посмотреть на последовательность изменений исходного кода из хранилища и восстановить «правдоподобную» историю изменений. Это то, что вы делаете, предлагая использовать «diff». Как вы заметили, diff не понимает идеи «перемещения» или «копирования».
SD Smart Differencer инструменты сравнивают исходный текст, анализируя текст в соответствии с языком, в котором он находится, обнаруживая структуры кода и вычисляя наименьшие левенские различия с точки зрения конструкций языка программирования (идентификаторов, выражений, операторы, блоки, классы, ...) и операторы редактирования абстрактов «вставить», «удалить», «скопировать», «переместить» и «переименовать идентификатор в области видимости». Они выдают разнородный вывод, немного богаче, потому что говорят строку / столбец -> строка / столбец с различными операциями редактирования.
Очевидно, что правки «переместить» и «скопировать» наиболее интересны для вас с точки зрения отслеживания определенных строк (ну, конечно, конкретных языковых конструкций). Наш опыт показывает, что код также проходит много копий и редактирований, что, я подозреваю, вас не удивит.
Эти инструменты находятся в бета-версии и в настоящее время доступны для COBOL, Java и C #. Множество других языков находятся в канале, потому что SmartDifferencer построен поверх инфраструктуры, параметризованной языком, DMS Software Reengineering Toolkit , которая содержит довольно много уже существующих надежных грамматик языка.