Git обнаружение переименования, когда класс и имя файла изменились за один коммит - PullRequest
7 голосов
/ 29 июня 2011

Каков наилучший способ обработки переименований классов (например, с помощью Resharper) с помощью Git?

То есть, если и имя класса, и имя содержащего его файла изменяются вместе и фиксируются без дальнейших изменений.

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

Ответы [ 2 ]

8 голосов
/ 30 июня 2011

Имейте в виду, что в истории Git переименования файлов не хранятся как "это было переименовано из X в Y". Вместо этого файл X существует в одной ревизии, а в следующей ревизии Y существует (а X нет). Например:

Revision | Files
---------+----------------------------------
HEAD^    | a.cpp    x.cpp             z.cpp
HEAD     | a.cpp              y.cpp   z.cpp

На приведенной выше диаграмме каждая ревизия представляет собой строку, и каждая содержит три файла. Между двумя ревизиями x.cpp был переименован в y.cpp. Единственная информация, которую хранит репозиторий, - это содержимое каждой отдельной ревизии.

Когда Git (или другой инструмент, который читает Git-репозитории) просматривает вышеупомянутую историю, он замечает, что y.cpp - это новый файл в HEAD. Затем он смотрит на предыдущую ревизию, чтобы увидеть, существовал ли подобный файл. В случае прямого переименования файла, тогда да, файл с именем x.cpp с идентичным содержимым существовал в предыдущей ревизии (и больше не существует в текущей ревизии). Таким образом, новый файл отображается как переименование от x.cpp до y.cpp.

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

Чтобы ответить на ваш вопрос, лучший способ обработать переименования классов reharper - это просто сделать это и зафиксировать новые файлы. Git хранит старые и новые файлы в своем хранилище. Обнаружение переименования обрабатывается позже, в тот момент, когда вы фактически спрашиваете об истории. Вот почему такие команды, как git log имеют такие параметры, как --find-copies и --find-copies-harder.

0 голосов
/ 06 декабря 2018

Спустя годы это все еще странность, я думаю, потому что это фундаментально для работы git.

Что я сейчас делаю, так это переименую, зафиксирую и внесу изменения. Немного раздражает использование инструментов рефакторинга, но никакое другое решение не сохраняет историю (--find-copies и --find-copies-harder, похоже, не работают).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...