随笔- 6  评论- 1  文章- 1 

SVN 如何更新整个目录

SVN 有时会遇到更新整个目录的情况, 比如依赖的某个库有了新版本, 需要更新. 这个时候的处理可能需要注意一些问题.(直接跳到最后看结论)

举个例子:

explor

根文件是 test, 里面用 externals 属性外链了一个 ext, ext 下面有一个 str 的文件夹, 这就是我们要更新的库了.

现在 str 的版本要更新, 怎么操作?

直接的想法:

在 ext 目录:

svn del str

将新版本拷贝过来:

svn add str

提交, 搞定.

ext里看log:

replace_log

看起来也OK.

不过这样的做法, 如果其他 SVN 用户改过这个被替换的文件夹, 却没来及提交的话, 就可能会有些问题.

下面模拟一下上面这种情况下, 用户可能的操作流程.看看问题在哪里(结论在最后).

用户口 A 先修改一些文件, 没提交:

edit1

edit2

用户 B 用Delete+add方式更新的整个目录.这时用户 A up 了整个目录.

会产生冲突.

conflict

因为前面用的是delete, 这时,其实是很难resolve的.比如试试resolve一下, 只有文件夹信息, 没有对应文件的修改信息:

resolve

这里很难把自己的修改,与 SVN 服务器上的修改 Merge 起来.

那来试试 revert 吧.把冲突的文件 revert 总可以吧?

直接在顶层目录操作, revert!!!

revert

结果却是无法revert 悲伤:

revert_error

再次在顶层目录 update 整个目录:

然后进入 str 目录, 发现 CFastString.h, CFastString.cpp 都已经是没有修改的, 而且是最新的. 因为更不到东西了嘛 悲伤 

up

那这回直接 resolved 吧 :!.

resolve1

resove完成~~

revert_suc

再次更新所有文件, 没有错误了.似乎一切正常了.

直到发现: str 目录下的文件一直是最旧的版本,而且死活 up 不下来最新的版本悲伤

如果提交,还会把 SVN 服务器上替换好的版本再次替换回来悲伤悲伤悲伤

什么地方出错了呢?

原因是: 当本地有修改的时候, svn 客户端无法完成 str 目录的替换操作. str 目录一直是删除前的那个.

在那个目录里, up 到最新也是 str 删除前的最新.所以 str 里的文件一直无法获得 svn 服务器上的最新版本. 即使服务器上有同名的 str 目录.

要注意的地方主要有:

1. 尽量改文件, 不改目录.

如果要更新某个库, 尽量不要 delete+add. 可以把旧版本的目录清空, 新版本的文件复制进来, 用TortoiseSVN 的 GUI 提交.

GUI里可以勾选missing的文件, SVN会自动删除. 这样可以把对目录的修改限制在比较小的范围. 让文件的log尽量连续.

2. 如果遇到别人使用 Delete+add更新某个目录, 自己如果修改过那个目录, 可以有两种方法避免上面的问题:

A. 删掉整个目录, 重新up.

B. 注意只可以在被 delete/add 的目录上层, 或者更上层的目录revert

 

posted on 2015-08-14 15:25 南方的骆驼 阅读(...) 评论(...) 编辑 收藏