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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM