Определите переименованный и измененный файл в Git, используя SHA1 - PullRequest
0 голосов
/ 30 ноября 2011

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

Я занимаюсь разработкой приложения на C # и мне нужно реализовать функцию git log --follow FILENAME.

Модификация проста: поиск файла с заданным путем в деревьях, прикрепленных к ревизии, если SHA1 отличается - Вуаля !

Переименовать тоже просто: если поиск по заданному пути не был успешным - ищите объект с таким же SHA1, как и ранее, если найден - Voilà !

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

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

Заранее большое спасибо за помощь!

1 Ответ

0 голосов
/ 30 ноября 2011

Git уже имеет эту функциональность. См. Опции -M / --find-renames, -C / --find-copies и -C -C / --find-copies-harder для diff (также относится к log и show) и опции --follow для log.

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

Редактировать : Более подробно: Чтобы обнаружить копии / переименования, git сначала сравнивает две ревизии, сравнивает списки файлов. Чем для каждого пути, который появляется только в новой ревизии, он сравнивает содержимое с файлами из старой ревизии, которые -M & mdash; были удалены, -C & mdash; были изменены или -C & mdash; все, и если они похожи достаточно (что требует diff), помечает его как переименовывать или копировать в зависимости от обстоятельств. Это является частью ядра diff и доступно всем командам, которые показывают различия в любой форме, включая имя-статус, которое не выполняет подробный построчный анализ. Вдобавок к этому --follow работает путем итерации ревизий одна за другой, выполняет изменение статуса имени с обнаружением переименования и выводит ревизию, если файл был изменен, и запоминает новое (старое) имя, когда он был переименован.

...