SVN衝突
- 2019 年 12 月 8 日
- 筆記
svn在提交的時候斷網極容易出現org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir —— "SVN 客戶端異常:試圖鎖定一個已經鎖定的目錄"。
這是什麼錯誤呢?根據提示能夠想到,我要提交代碼的時候,SVN 所做的工作中有一個操作步驟是"鎖定",所以才會有"Attempted to lock "這一步,至於"an already-locked dir",我忽然想到,昨晚下班我嘗試過一次提交代碼,但是由於忘記切換網絡而作罷(我們 SVN 部署在內網上,而平時可以聯外網)。而 SVN 正好在這裡有個問題——如果你的環境沒有聯上有效的 SVN 倉庫,那麼在提交的時候就會卡在這裡,會有一個 Progress 一直在跑但又跑不完,我就是在這種情況下使用資源管理器強制關閉進程,所以今天再提交的時候會"the dir you Attempted to lock has been already-locked"。所以我也可以肯定,SVN 提交代碼第一步就是 lock 你要提交代碼所在的 dir,(我的經歷證明,沒有有效的資源庫聯接,這之後都不能工作)然後才檢查資源庫代碼版本…提交…。
- 問題處理
按說按照提示"嘗試鎖定一個已經被鎖定的目錄",就像"你去把門鎖上,其實門就是鎖上的",這一命令就沒法執行了。應該只要 "release lock"就可以再次進行鎖定了。然而並非如此,原因就是:此 lock 非彼 lock !你在右鍵 SVN 菜單中能找到所有 " [ * ] lock" 命令都是對 SVN 倉庫所做的操作,不信你試試,都會讓你填操作說明的,說明這是對倉庫源有改變(這裡的lock是指在代碼庫中標記為鎖定狀態,不允許更改);我們這裡的鎖定只是在一次代碼提交階段暫時性"舉起手來,不許動",等提交操作完成了就取消鎖了,是為了保證在提交過程中不被更改(提交代碼需要網絡通信,如果網絡質量不好就比較耗時,你可能在此過程中對正在提交的代碼更改),所以我只要 cleanup 上次的鎖定就可以了。
- 這裡提供3中方法:
(一)Eclipse SVN 插件處理 使用 SVN 插件時,選中能包含所有待提交代碼的最小的包(當然你可以直接選擇工程也無可厚非,我只是為了最小影響範圍原則而已),右鍵選擇 Team > Refresh/Cleanup ,再進行提交操作(前提是具備有效的SVN倉庫聯接)就可以了。

(二)SVN 客戶端處理 (1)如果你安裝了SVN客戶端(就那個小烏龜),並不是說要通過客戶端操作,只是安裝了客戶端,右鍵才有 SVN 子菜單* 打開 workspace 中對應的文件夾,右鍵 TortoiseSVN > clean up… 。

(2)如果你身具極客風度,也可以使用 svn 命令:svn cleanup …(操作目標目錄路徑)
(三)刪除lock文件 還有網上看到一種方法說是,直接進入到上面的文件夾下的.svn目錄,刪除lock文件就可以了。(這個方法我沒試過,其實是因為笨得根本就沒找見 lock 文件)

