SVN 有時會遇到更新整個目錄的情況, 比如依賴的某個庫有了新版本, 需要更新. 這個時候的處理可能需要注意一些問題.(直接跳到最后看結論)
舉個例子:
根文件是 test, 里面用 externals 屬性外鏈了一個 ext, ext 下面有一個 str 的文件夾, 這就是我們要更新的庫了.
現在 str 的版本要更新, 怎么操作?
直接的想法:
在 ext 目錄:
svn del str
將新版本拷貝過來:
svn add str
提交, 搞定.
ext里看log:
看起來也OK.
不過這樣的做法, 如果其他 SVN 用戶改過這個被替換的文件夾, 卻沒來及提交的話, 就可能會有些問題.
下面模擬一下上面這種情況下, 用戶可能的操作流程.看看問題在哪里(結論在最后).
用戶口 A 先修改一些文件, 沒提交:
用戶 B 用Delete+add方式更新的整個目錄.這時用戶 A up 了整個目錄.
會產生沖突.
因為前面用的是delete, 這時,其實是很難resolve的.比如試試resolve一下, 只有文件夾信息, 沒有對應文件的修改信息:
這里很難把自己的修改,與 SVN 服務器上的修改 Merge 起來.
那來試試 revert 吧.把沖突的文件 revert 總可以吧?
直接在頂層目錄操作, revert!!!
結果卻是無法revert :
再次在頂層目錄 update 整個目錄:
然后進入 str 目錄, 發現 CFastString.h, CFastString.cpp 都已經是沒有修改的, 而且是最新的. 因為更不到東西了嘛
那這回直接 resolved 吧 :!.
resove完成~~
再次更新所有文件, 沒有錯誤了.似乎一切正常了.
直到發現: 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