解决 svn: local missing, incoming edit upon merge

事情源于今天下午做的一个svn rebase操作

trunk上有文件a.sql, 在newbranch上被改名成了b.sql。在我对newbranch做rebase之前,trunk上的a.sql又从其他branch merge到了一些改动,于是当我svn merge trunk -> newbranch的时候就不可避免的出现了tree conflict。这个时候用svn st查看newbranch上working copy的状态就会发现这个文件的状态是 “> local missing, incoming edit upon merge”。

解决办法就是首先svn resolve --accept working a.sql,将tree conflict先解决,这时候在working copy里a.sql是不存在的(因为working copy里只有b.sql)。然后需要将a.sql从其他branch merge来的改动也merge回newbranch上的b.sql。

svn log --stop-on-copy newbranch 获取newbranch创建时的revision,假设为r100
svn merge -r100:HEAD '^/trunk/a.sql' b.sql 把所有从r100开始到head所有对于a.sql的改动全部merge到b.sql。至此,这个头疼的local missing, incoming edit upon merge就解决。如果有多个文件则依次逐个merge。

归根结底这源于svn对于文件移动的实现是copy + delete,这样会赋予改名后的新文件一个新的revision。2002年的时候就有人因此开了一个bug ticket,不过看样子是不会有fix了…

如果想一劳永逸解决这个问题,最终解决方案就是放弃svn转投git