web服务器 技术随笔

服务器上svn up 失败,svn冲突

一、服务器上 svn up 报冲突(Node remains in conflict)

本地改了几个文件(含 api.php)提交到服务器,然后在服务器用 shell 脚本执行 svn up 时出错:

Skipped 'xxx' -- Node remains in conflict
At revision 1054.
Summary of conflicts:
  Skipped paths: 1

网上常见两种处理方式:

# 方式一:把工作副本备份后整体 revert 再 update
cd /home/svn/app/
mkdir /root/bak
mv /home/svn/app/* /root/bak/
svn revert .
svn up

# 方式二:对单个冲突文件出“绝招”
svn remove --force filename
svn resolve --accept=working filename
svn up

方式一对整个工作副本操作,风险较大不敢用,于是直接用了方式二:

svn remove --force api.php; svn resolve --accept=working api.php; svn up

结果 api.php 被删掉了,再 svn up api.php 也更新不回来(还好是在测试服务器)。继续试:

svn resolve --accept working api.php     # 仍提示 Tree conflicts: 1
svn resolve --accept theirs-full api.php # 仍提示 Tree conflicts: 1

参考 svn 中 tree conflicts 错误的原因。最后用 svn revert 取消变更,文件才回来:

svn revert api.php

在本地给文件加两个空格(让内容发生变化可重新提交),提交后到 Linux 服务器上 svn up api.php,终于更新成功。

二、svn 冲突的几种解决办法

冲突一般发生在两人都改了同一处、后提交者 update 时。update 后会多出 1.txt.mine(我的修改)、1.txt.rOld(base 版本)、1.txt.rNew(最新版本),工作副本中的文件会带冲突标记:

<<<<<<< .mine
dfqerq
123dfwre
=======
dfqerq
123erwrq
>>>>>>> .r18

1、update 时直接处理(--accept)

--accept ARG : 指定自动冲突解决动作
  (p)  postpone          - 保留冲突状态稍后处理
  (df) diff-full         - 显示 base 与冲突文件的全部差异
  (e)  edit              - 用编辑器打开冲突文件
  (r)  resolved          - 接受合并后的版本(解决冲突)
  (mf) mine-full         - 采用我的版本(丢弃对方改动)
  (tf) theirs-full       - 采用对方版本(丢弃我的改动)
  (l)  launch            - 启动外部工具解决冲突

2、先 update 再用 svn resolve

svn resolve --accept base         1.txt  # 用 base 版本
svn resolve --accept working      1.txt  # 手工改完后用当前副本
svn resolve --accept theirs-full  1.txt  # 用最新版本
svn resolve --accept mine-full    1.txt  # 用我的版本
svn resolve --accept mine-conflict   1.txt  # 仅用我方冲突部分
svn resolve --accept theirs-conflict 1.txt  # 仅用对方冲突部分

3、svn revert 取消变更

svn revert 1.txt   # 放弃本地修改,回退到版本库版本

注意:tree conflict(树冲突)只能用 --accept working 解决,用 theirs-full 会提示 “Tree conflicts can only be resolved to 'working' state”。

标签
svn