Исправление переименований в репозитории Mercurial после фиксации

Многие файлы в нашем репозитории Mercurial были перемещены за один коммит, но эти файлы не были помечены как переименованные. Что еще хуже, некоторые файлы также были изменены в том же коммите.

Как я могу вернуть набор изменений и правильно определить переименования, сохраняя при этом изменения и файл перемещается?

3 ответа

Существует альтернатива редактированию истории (также известной как MQ) для исправления переименований. Ручная процедура описана здесь как логика, используемая расширением fixrenames.

Ручной процесс заключается в следующем. Для каждой ревизии N, для которой есть переименования, не отмечены:

$ hg update n-1
$ hg revert --all --rev n
$ hg addremove -s 70
$ hg commit -m "Fix renames from n"
$ hg merge n

Обратите внимание, что флаг сходства иногда требует возиться. Причина в том, что переименования почти никогда не являются чистыми переименованиями. Например, переименование класса требует изменения файла, а также изменения имени файла. Таким образом, они не на 100% одинаковы. Вам нужно будет просмотреть, что делает addremove, и убедиться, что добавленные файлы помечены как "X (переименовано из Y)".

Таким образом, вы можете восстановить полную историю без кучу ручной работы. Я должен был сделать это сегодня (без использования расширения fixrenames), и мне потребовалось около 5 минут, чтобы исправить.

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

График изменений будет выглядеть следующим образом. Рассмотрим наборы изменений A, B, C и D. B и D имеют неправильные переименования:

D
|
C
|
B
|
A

Сначала мы обновляем A, делаем возврат на место к B, делаем addremove и фиксируем как E. Затем мы объединяем C в E как F, так как C не имеет с этим ничего плохого. Вы должны увидеть что-то вроде этого:

F D
|\|
| C
| |
E B
|/
A

Теперь примените то же самое для D. Мы обновляем F, возвращаемся из D, добавляем удаление и фиксируем G. Теперь мы просто объединяем, чтобы закрыть дополнительную головку. Вы должны увидеть что-то вроде этого:

H
|\
G |
| |
F D
|\|
| C
| |
E B
|/
A

Если вы хотите убедить себя, что это сработало, вы всегда можете

hg diff -r D -r H

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

Автоматизированная версия ответа MrFox

  1. Экспортируйте изменения "плохой" ревизии в файл патча (возможно, в git-формате) или сохраняйте в пакет или конвертируйте в MQ-патч
  2. Обновите рабочий каталог для родителя плохой ревизии
  3. Применить патч | импортировать комплект
  4. использование hg addremove -s NN в измененном рабочем каталоге для обнаружения переименований (NN должен быть найден вручную, все переименования должны быть обнаружены в результате), проверьте результаты угадывания с hg status -Cповторяйте adremove до тех пор, пока правильный результат не будет получен
  5. Совершите новый хороший набор изменений
  1. Составьте список всех изменений, внесенных в файлы.
  2. Обновите обратно до версии, где файлы не были перемещены.
  3. Переименуйте файлы.
  4. Измените внутренние файлы, где это необходимо.
  5. Commit.
Другие вопросы по тегам