Как git отслеживает перемещение исходного кода между файлами?

По-видимому, когда вы перемещаете функцию из одного файла исходного кода в другой, журнал изменений git (для нового файла) может показать вам, откуда этот фрагмент кода был изначально взят (см., Например, раздел «Просмотр истории» вэтот урок).

Как это работает?

Ответы на вопрос(2)

Решение Вопроса

Git записывает только снимки всего дерева проекта: здесьс чемвсе файлы выглядел как до коммита и здеськак они выглядят после.Как мы добрались отсюда туда, Git нене волнует.

Это позволяет писать интеллектуальные инструментыпосле Коммит уже произошел, чтобы извлечь информацию из этого коммита. Например, обнаружение переименования в Git выполняется путем сравнения всех удаленных файлов со всеми новыми файлами и сравнения попарных метрик подобия. Если показатель сходства больше, чемx, они считаются переименованными, если это междуy а также (xy < x), это считается переименованием + редактированием, и если оно нижеyони считаются независимыми. Самое классное, что ты, каксовершить археолог ", можете указать после того, чтоx а такжеy должно быть. Это не будет работать, если фиксация просто записанаэтот файл является переименованием этого файла ".

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

Однако, как Тонфа упоминал в своем ответе, этоочень дорого, так что обычно это не делается. Но этомог быть сделано, и этоСуть в том.

Кстати, это в значительной степени полная противоположность модели оперативного преобразования, используемой Google Wave, EtherPad, Gobby, SubEthaEdit, ACE и Co.

 pjz12 июн. 2014 г., 18:11
Красота в том, что мерзавец неПредполагается, что его текущие эвристики являются правильными - он просто сохраняет данные и позволяет позже интерпретировать эти данные, используя любую эвристику, какую вы пожелаете. Это также означает, что если какая-то эвристика действительно дорогая для вычислений, это может быть сделано где-то, кроме (возможно, очень занятого!) Общего репо.
 kdb14 мар. 2019 г., 16:09
@tavnab Gmane-ссылка перестала работать, но почтавсе еще доступен через веб-архив.
 Kos26 июл. 2011 г., 10:19
Я нене совсем понимаюТот'это красота ", Я имею в виду, ваше объяснение звучит какGit не делаетне храните то, что на самом деле происходит с файлами, чтобы вы могли сами догадаться об этом позже! " Куда'красота?
 Frank Schwieterman21 дек. 2013 г., 23:42
Кос, ты не должен догадываться об этом позже. У Git есть эвристика, чтобы обнаружить это, когда это важно (то есть, когда слияние).
 tavnab26 дек. 2015 г., 13:36
FWIW, Линус объяснил обоснование этого выбора дизайна вэто письмов классической моде Линус.
 nikow08 мая 2012 г., 09:52
На мой взгляд, прелесть этого в том, что отслеживание не должно быть частью основного контроля версий. "Аутсорсинг» эта особенность позволяет избежать многих осложнений и недостатков, например, SVN. Вы получаете простоту и гибкость (инструменты SVN обычно ограничены использованием информации об отслеживании, которая была первоначально записана, даже если это может не быть хорошим представлением о том, что на самом деле произошло с базой кода).

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

 Jakub Narębski13 нояб. 2009 г., 14:46
Смотрите документацию для-M а также-C варианты вмерзавец страница руководства.
 Thilo13 нояб. 2009 г., 13:53
и только в пределах одного коммита?
 tonfa13 нояб. 2009 г., 14:27
Да, он ищет подходящие файлы с одним и тем же коммитом.

Ваш ответ на вопрос