Может ли Git действительно отслеживать перемещение одной функции из одного файла в другой? Если да, то как?


несколько раз я сталкивался с утверждением, что если вы перемещаете одну функцию из одного файла в другой файл, Git может отслеживать ее. Например, запись

5 55

5 ответов:

эта функция предоставляется через git blame-C

опция-C заставляет git пытаться найти совпадения между добавлением или удалением фрагментов текста в рассматриваемом файле и файлами, измененными в тех же наборах изменений. Дополнительно-CC, или-CCC расширить поиск. Типа ГИТ помочь винить в справочнике.

попробуйте сами в тестовом РЕПО с git blame-C, и вы увидите, что блок кода, который вы только что переместили, создан в исходном файле где ему и место.

по состоянию на Git 2.15,git diff теперь поддерживает обнаружение перемещаемых линий с помощью . Он работает для перемещений по файлам.

это работает, очевидно, для цветного вывода. Насколько я могу судить, нет возможности указать перемещения в формате простого текстового патча, но это имеет смысл.

для поведения по умолчанию, попробуйте

git diff --color-moved

команда также принимает параметры, которые в настоящее время являются no,default,plain,zebra и dimmed_zebra (использовать git help diff чтобы получить последние варианты и их описания). Например:

git diff --color-moved=zebra

как как это сделано, вы можете почерпнуть некоторое понимание из это обмен электронной почтой от автора функционала.

немного этой функциональности находится в git gui blame (+filename). Он показывает аннотацию строк файла, каждая из которых указывает, когда она была создана и когда в последний раз изменялась. Для перемещения кода по файлу он показывает фиксацию исходного файла как создание, а фиксацию, где он был добавлен в текущий файл, как последние изменения. Попробовать его.

то, что я действительно хотел дать git log в качестве некоторого аргумента диапазон номеров строк дополнительно к пути к файлу, а затем он показал бы историю этого блока кода. Нет такого варианта, если документация верна. Да, из заявления Линуса я тоже думаю, что такая команда должна быть легко доступна.

git на самом деле не отслеживает переименования на всех. Переименование - это просто удаление и добавление, вот и все. Любые инструменты, которые показывают переименования, восстанавливают их из этой исторической информации.

таким образом, переименование функции отслеживания-это простой вопрос анализа различий всех файлов в каждой фиксации после факта. В этом нет ничего особенно невозможного; существующее отслеживание переименования уже обрабатывает "нечеткие" переименования, в которых некоторые изменения вносятся в файл, а также переименование его; это требует просмотра содержимого файлов. Это было бы простое расширение для поиска переименований функций.

Я не знаю, действительно ли базовые инструменты git делают это - они пытаются быть нейтральными к языку, а идентификация функций очень не нейтральна к языку.

здесь git diff Это покажет вам, что некоторые строки исчезли из foo и снова появился в bar. Если в этих файлах нет других изменений в той же фиксации, изменение будет легко обнаружить.

интеллектуал git клиент сможет показать вам, как строки перемещаются из одного файла в другой. Языковая среда IDE сможет соотнести это изменение с определенной функцией.

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