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