Разрешить противоречивый конфликт в дереве /etc (etckeeper на основе Mercurial)
У меня есть /etc
файловое дерево, которым управляет etckeeper
, основанный на Mercurial. После запуска apt-get dist-upgrade
Я хочу пересмотреть изменения, которые были применены при обновлении.
Однако при выполнении
hg add $(hg status . --unknown --no-status)
Я получаю этот конфликт:
abort: file 'php5/apache2/conf.d' in dirstate clashes with 'php5/apache2/conf.d/05-opcache.ini'
hg status php5/apache2/conf.d
дает мне:
! php5/apache2/conf.d
? php5/apache2/conf.d/05-opcache.ini
? php5/apache2/conf.d/10-pdo.ini
? php5/apache2/conf.d/20-json.ini
? php5/apache2/conf.d/20-readline.ini
Это выглядит противоречиво для меня: если каталог php5/apache2/conf.d
будет отсутствовать, как он может содержать новые (неверсионные) файлы?!
Как я могу решить этот конфликт?
(Debian Linux, обновлён с 7.11 до 8.5; Mercurial 3.4.2)
1 ответ
Кажется пропавшим (/etc/)php5/apache2/conf.d
была символическая ссылка, которая была заменена каталогом.
Я положил каталог в архив tar, просто чтобы быть в безопасности, и попытался hg revert php5/apache2/conf.d
, который дал (немецкая версия; извините, я забыл повторить с LANG=C
):
Abbruch: Konnte symbolische Verknüpfung auf '../conf.d' nicht erzeugen: File exists: '/etc/php5/apach2e/conf.d'
Если hg revert
пытается создать символическую ссылку, я предполагаю, что отсутствующий ресурс был символической ссылкой. Этот маленький танец сделал свое дело (дважды - для php5/apache2
а также php5/cli
):
mv conf.d conf.d-tmp
hg rm conf.d
hg commit conf.d -m 'Conflict resolution, part 1'
mv conf.d-tmp conf.d
hg commit conf.d -m 'Conflict resolution, part 2'
После этого я смог добавить все оставшиеся "неизвестные" ресурсы и удалить все оставшиеся "удаленные" ресурсы:
hg add $(hg status -un)
hg rm $(hg status -dn)