解决 /etc 树中的矛盾冲突(基于 mercurial 的 etckeeper)

解决 /etc 树中的矛盾冲突(基于 mercurial 的 etckeeper)

我有一个由基于 Mercurial/etc管理的文件树。运行后,我想修订升级后应用的更改。etckeeperapt-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/apache2php5/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)

相关内容