Разрешить противоречивый конфликт в дереве /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)
Другие вопросы по тегам