Subversion 通常在不鎖定的情況下運作最佳,使用稍早在名為「複製-修改-合併 方案」的章節中描述的 “複製-修改-合併” 方法。然而,在某些情況下,您可能需要實作某種形式的鎖定策略。
您正在使用 “無法合併” 的檔案,例如,圖形檔案。如果兩個人變更同一個檔案,則無法合併,因此你們其中一人將會遺失其變更。
您的公司過去一直使用鎖定的版本控制系統,並且管理階層決定 “鎖定是最佳的”。
首先,您需要確保您的 Subversion 伺服器已升級到至少 1.2 版。較早的版本完全不支援鎖定。如果您使用 file://
存取,那麼當然只有您的用戶端需要更新。
在本節以及本書幾乎所有地方,“鎖定” 一詞描述使用者之間互相排斥的機制,以避免提交衝突。不幸的是,還有另外兩種 “鎖定” 與 Subversion 有關,因此本書有時需要關注。
第二種是 工作副本鎖定
,Subversion 在內部使用它來防止多個 Subversion 用戶端在同一個工作副本上操作時發生衝突。通常,當更新/提交/... 等命令因錯誤而中斷時,您會取得這些鎖定。可以透過在工作副本上執行清除命令來移除這些鎖定,如名為「清除」的章節中所述。
第三,如果檔案和資料夾正在被另一個程序使用,它們可能會被鎖定,例如,如果您在 Word 中開啟一個 Word 文件,該檔案就會被鎖定,TortoiseSVN 無法存取。
您通常可以忘記這些其他種類的鎖定,直到發生某些錯誤,需要您關心它們。在本書中,“鎖定” 指的是第一種,除非從上下文中清楚表明或明確說明相反的情況。
預設情況下,沒有任何東西被鎖定,任何具有提交權限的人都可以隨時提交對任何檔案的變更。其他人會定期更新他們的工作副本,並且儲存庫中的變更將與本機變更合併。
如果您對檔案 取得鎖定,那麼只有您可以提交該檔案。所有其他使用者的提交都將被封鎖,直到您釋放鎖定。鎖定的檔案在儲存庫中無法以任何方式修改,因此除了鎖定擁有者之外,也無法刪除或重新命名。
鎖定不是分配給特定使用者,而是分配給特定使用者和工作副本。在一個工作副本中擁有鎖定也會阻止同一使用者從另一個工作副本提交鎖定的檔案。
舉例來說,假設使用者 Jon 在他的辦公室 PC 上有一個工作副本。他在那裡開始處理一個影像,因此取得該檔案的鎖定。當他離開辦公室時,他還沒有完成該檔案,所以他沒有釋放該鎖定。回到家後,Jon 也有一個工作副本,並決定在這個專案上多做一點工作。但他無法修改或提交同一個影像檔案,因為該檔案的鎖定存在於他在辦公室的工作副本中。
然而,其他使用者不一定會知道您已取得鎖定。除非他們定期檢查鎖定狀態,否則他們第一次知道鎖定是在他們的提交失敗時,這在大多數情況下不是很有用。為了更容易管理鎖定,有一個新的 Subversion 屬性 svn:needs-lock
。當在檔案上設定此屬性(為任何值)時,每當檔案被取出或更新時,本機副本都會變成唯讀 除非 該工作副本持有該檔案的鎖定。這充當警告,除非您先取得鎖定,否則不應編輯該檔案。已版本控制且唯讀的檔案在 TortoiseSVN 中標記有特殊覆蓋圖示,以指示您需要在編輯之前取得鎖定。
鎖定會記錄工作副本位置以及擁有者。如果您有多個工作副本(在家裡、在工作場所),那麼您只能在其中 一個 工作副本中持有鎖定。
如果您的同事之一取得鎖定,然後在沒有釋放鎖定的情況下去度假,您該怎麼辦?Subversion 提供了一種強制鎖定的方法。釋放別人持有的鎖定稱為 解除鎖定,而強制取得別人已持有的鎖定稱為 竊取鎖定。自然地,如果您想與您的同事保持友好關係,這些不是您應該輕易做的事情。
鎖定記錄在儲存庫中,並且在您的本機工作副本中建立鎖定權杖。如果存在差異,例如如果其他人已解除鎖定,則本機鎖定權杖將失效。儲存庫始終是最終參考。
在您的工作副本中選取您要取得鎖定的檔案,然後選取命令
→ 。
會出現一個對話方塊,讓您輸入註解,以便其他人可以看到您鎖定檔案的原因。註解是選填的,目前僅用於基於 Svnserve 的儲存庫。如果(而且 只有 在您需要從其他人那裡竊取鎖定的情況下),請勾選 竊取鎖定 方塊,然後按一下 。
您可以設定專案屬性 tsvn:logtemplatelock
以提供訊息範本,供使用者填寫作為鎖定訊息。請參閱名為「專案設定」的章節,以取得有關如何設定屬性的說明。
如果您選取一個資料夾,然後使用 每個 子資料夾中的 每個 檔案進行鎖定。如果您真的想鎖定整個階層,這是可行的方法,但是如果您將他們排除在整個專案之外,您可能會變得非常不受同事歡迎。請謹慎使用...
→ ,鎖定對話方塊將會開啟,並選取為了確保您不會忘記釋放您不再需要的鎖定,鎖定的檔案會顯示在提交對話方塊中,並且預設為選取。如果您繼續提交,即使檔案尚未修改,您持有的選取檔案的鎖定也會被移除。如果您不想釋放某些檔案的鎖定,您可以取消選取它們(如果它們未修改)。如果您想保留已修改檔案的鎖定,您必須在提交變更之前啟用 保留鎖定 核取方塊。
若要手動釋放鎖定,請在您的工作副本中選取您要釋放鎖定的檔案,然後選取命令
→ 。無需進一步輸入,因此 TortoiseSVN 將聯絡儲存庫並釋放鎖定。您也可以在資料夾上使用此命令以遞迴方式釋放所有鎖定。
若要查看您和其他人持有的鎖定,您可以使用 → 。本機持有的鎖定權杖會立即顯示。若要檢查其他人持有的鎖定(以及查看您的任何鎖定是否已損壞或被竊取),您需要按一下 。
從此處的上下文選單中,您也可以取得和釋放鎖定,以及解除鎖定和竊取其他人持有的鎖定。
如果您在沒有告知別人的情況下解除鎖定或竊取別人的鎖定,您可能會導致工作遺失。如果您正在使用無法合併的檔案類型,並且您竊取了別人的鎖定,一旦您釋放鎖定,他們就可以自由簽入他們的變更並覆寫您的變更。Subversion 不會遺失資料,但是您已遺失鎖定給您的團隊合作保護。
如上所述,使用鎖定最有效的方法是在檔案上設定 svn:needs-lock
屬性。請參閱名為「專案設定」的章節,以取得有關如何設定屬性的說明。設定此屬性的檔案將始終以唯讀旗標取出和更新,除非您的工作副本持有鎖定。
作為提醒,TortoiseSVN 使用特殊覆蓋圖示來指示這一點。
如果您實施每個檔案都必須鎖定的策略,那麼您可能會發現使用 Subversion 的自動屬性功能更容易,以便在每次新增檔案時自動設定屬性。請閱讀名為「自動屬性設定」的章節以取得更多資訊。
當您使用 Subversion 1.2 或更高版本建立新的儲存庫時,會在儲存庫 hooks
目錄中建立四個 hook 範本。這些範本在取得鎖定之前和之後,以及在釋放鎖定之前和之後呼叫。
在伺服器上安裝 post-lock
和 post-unlock
hook 腳本是一個好主意,該腳本會發送電子郵件,指出哪個檔案已被鎖定。有了這樣的腳本,如果有人鎖定/解除鎖定檔案,您的所有使用者都可以收到通知。您可以在儲存庫資料夾中找到範例 hook 腳本 hooks/post-lock.tmpl
。
您也可以使用 hook 來禁止解除鎖定或竊取鎖定,或者可能將其限制為指定的管理員。或者,當某人的鎖定被解除或竊取時,您可能想要發送電子郵件通知擁有者。
請閱讀名為「伺服器端 hook 腳本」的章節以了解更多資訊。