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