硬廣:《SVN與TortoiseSVN實戰》系列已經寫了八篇,本篇是完結篇,整個系列結合TortoiseSVN對SVN中容易被忽視的部分進行了詳解,以技巧性為主。
本篇詳解使用TortoiseSVN對文件進行加鎖和解鎖的技巧,其中涉及到了之前介紹的SVN屬性知識,關於屬性可以翻看《SVN與TortoiseSVN實戰:屬性的奇技淫巧(一)》、《SVN與TortoiseSVN實戰:屬性的奇技淫巧(二)》。
加鎖與解鎖的操作對於項目中的二進制文件,如圖片、聲音、動態庫等不可合並文件是非常有用的,可以讓這些文件防止產生惱人的沖突,但TortoiseSVN中的Get lock的其實並不能滿足需要,並不能在編輯前獲得對文件的獨占訪問,這也是本文要結合屬性來詳解文件加鎖的原因。
本篇內容概要:
1、版本控制系統的加鎖策略:樂觀加鎖、嚴格加鎖;
2、使用TortoiseSVN獲取鎖和釋放鎖;
3、使用屬性,將文件設置為只讀;
4、關於鎖的建議;
1、版本控制系統的加鎖策略:樂觀加鎖、嚴格加鎖
為了避免多個人同一時間對同一個文件改動的相互覆蓋,版本控制系統就必須有一套沖突處理機制。
對於解決沖突,有兩種處理辦法:樂觀加鎖和嚴格加鎖。
嚴格加鎖:所有簽出的文件都是只讀的,任何對文件的修改必須要獲得文件的鎖,如果其他人沒有擁有該文件的鎖,那么版本控制系統就會授權給你文件的鎖,並將文件設置為可編輯的。
樂觀加鎖:所有簽出的文件都是可讀寫的,對文件的修改不必獲得文件的鎖,當你修改完文件簽入時,會首先要求你更新本地文件,版本控制系統不會覆蓋你的本地修改,而是會讓你自己合並沖突后簽入。
SVN使用的是樂觀加鎖策略,而像TFS一類的版本控制系統允許你對加鎖策略進行選擇。
相比於嚴格加鎖,樂觀加鎖可能會有較高的產生沖突的概率,但允許團隊成員任何時間對文件進行編輯,擁有極大的協作效率。
對於像不可合並的二進制文件或想在某些文件和目錄上采取嚴格加鎖策略,SVN也提供了嚴格加鎖的辦法,就是對文件的加鎖解鎖操作。
2、使用TortoiseSVN獲取鎖和釋放鎖;
SVN默認情況下,所有的文件都沒有鎖定,只要有提交權限的人都可以在任何時候提交任何的文件。其他人會定時更新他們的工作目錄,在庫中的改變的東西都會與本地合並。
如果你對一個文件獲得鎖定,那么只有你可以提交這個文件。其他用戶的提交都會被拒絕,直到你釋放了這個鎖。
獲取鎖:
選擇你想要獲取鎖定的文件,然后右鍵菜單點擊TortoiseSVN Get lock,將會彈出鎖定窗口:
一個良好的習慣是每次獲取鎖定時,在紅色標注位置輸入獲取鎖的原因。
釋放鎖:
有兩種情況會釋放鎖:
1、選擇你想要釋放鎖定的文件,然后右鍵菜單點擊TortoiseSVN Release lock;
2、TortoiseSVN為了確保你不會忘記釋放鎖,在提交對話框中,總是會顯示鎖定的文件,並總是默認被選中。如果你繼續提交,選中的文件中的鎖就被移除了,就算你從沒有修改過。可以在鎖定文件的目錄上使用Commit,打開提交對話框驗證一下。
如果你不希望釋放文件的鎖,就必須取消選中它。
問題是什么?
如果實際操作過,使用過TortoiseSVN 的 Get lock來加鎖,就會發現並不如你所預期的,對文件實現了嚴格加鎖,本篇也就不必要寫了。
問題在哪?使用TortoiseSVN 的 Get lock鎖定文件后,其他用戶並不知道你對這個文件已經鎖定,即時他們簽出最新的版本,依然能夠對文件在本地進行修改,文件依然是可讀寫的狀態。
這是一個在其他成員電腦上已經Get lock的文件,可以看到與其他文件在狀態上沒有任何區別:
這樣其實是沒有意義的,別人依然會對你鎖定的文件進行修改,只有當他們在簽入時才會發現文件已經被鎖定:
這種加鎖操作下,團隊成員需要定期的檢查文件的鎖定狀態,可以使用TortoiseSVN的check for modifications:
3、使用屬性,將文件設置為只讀;
之所以存在被鎖定后其他成員依然可以在本地修改,是因為SVN所采取的是樂觀加鎖的策略。
如果我們想對某個文件或某個目錄采取嚴格加鎖策略,更明確的說是:所有文件默認為只讀,在文件修改前需要先獲取鎖,只有其他人不擁有鎖時才可以鎖定文件並修改。
要實現嚴格加鎖,就需要使用SVN的svn:needs-lock屬性。
在想要采取嚴格加鎖的文件或目錄上點擊右鍵,使用TortoiseSVN Properties屬性菜單,點擊News新建屬性,選擇Needs-lock:
設置為Locking required,簽入屬性修改操作,可以發現文件的圖標狀態改變了,並變為只讀:
當設置了svn:needs-lock屬性時,實際上對文件就采取嚴格加鎖策略,對文件的任何修改都必須先使用TortoiseSVN 的 Get lock鎖定文件。
4、關於鎖的建議
對於項目中的二進制文件,如圖片、聲音、動態庫等,可以在目錄上統一設置svn:needs-lock屬性,避免在這些文件上產生沖突,浪費解決沖突的時間。
結語:本系列一共九篇,對SVN中的技巧基本上進行了全面的介紹,希望對大家有所幫助。如果想要系統的學習SVN,可以閱讀《版本控制之道》這本書,本系列所講的內容與書中的內容並不完全重復,更側重於實戰性和技巧性的內容,最后希望大家在項目開發中能正確、合理運用SVN。