TortoiseSVN學習--檢出、提交、更新、衝突及解決、鎖定與解鎖

一、建立一個 runoob01 的工作目錄

所謂的 runoob01 目錄其實就是您平常用來存放工作檔案的地方。通常我們會等到自己的工作做的一個段落的時候再進行備份。所以我們平常都是在 runoob01 目錄下面工作,等到適當時機在 commit 到 repository 中。舉例來說,我們想在 F 盤下面建立一個名爲 runoob01 的目錄。首先先把這個目錄建立出來。進入創建的目錄在空白處按下右鍵後,選擇 SVN 檢出(check out):
在這裏插入圖片描述
彈出對話框如下:
在這裏插入圖片描述

  • 版本庫URL:https://10.17.102.220/svn/runoob01;我們測試的版本倉庫地址,該倉庫應已在服務器中存在
  • 檢出至目錄:我們要將服務器中的項目複製到的目錄,默認爲當前目錄即runoob01目錄;

按下確定鍵後,會提示“檢出成功”,並在當前runoob01目錄下多出一個**.svn**的目錄(注:該目錄爲隱藏屬性)。

二、新增文件及目錄到Repository

新建目錄Dir01,並在該目錄下新建文件file01.txt
在這裏插入圖片描述
右鍵目錄空白處,SVN相關菜單:
在這裏插入圖片描述

  • SVN更新(Update):將服務器上repository的最新狀態更新到本地;
  • SVN提交(commit):將本地修改後的狀態提交到服務器上repository中;

這裏我們選擇SVN提交:在這裏插入圖片描述
工具會默認提交至對應的repository,我們添加提交的信息,選擇提交的文件和文件夾,點擊確定按鈕:
在這裏插入圖片描述
這時候,可以看到Dir01文件夾前面多了一個藍色的加號,表示Dir01已經準備添加到repository中(並未真正放到repository中),點擊對話框確定按鈕後,可以看到Dir01文件夾前面變成了綠色的對號,這時,文件及文件夾才真正放入服務器的Repository中。
在這裏插入圖片描述

三、更新檔案及目錄(Update)

由於版本控制系統多半都是由許多人共同使用。所以,同樣的檔案可能還有人會去進行編輯。爲了確保您工作目錄中的檔案與 Repository 中的檔案是同步的。建議您在編輯前都先進行更新的動作。

在想要更新的檔案或項目目錄空白處上面按下鼠標右鍵。並且選擇 SVN 更新(Update)。
在這裏插入圖片描述
如果設定更新的具體版本,可右鍵選擇TortoiseSVN->更新至版本…,選擇相應的版本
在這裏插入圖片描述

四、版本衝突及解決

更新提交過程中版本衝突原因:
假設 A、B 兩個用戶都在版本號爲 100 的時候,更新了 file01.txt 這個文件,A 用戶在修改完成之後提交 kingtuns.txt 到服務器, 這個時候提交成功,這個時候 file01.txt 文件的版本號已經變成 101 了。同時B用戶在版本號爲 100 的 file01.txt 文件上作修改, 修改完成之後提交到服務器時,由於不是在當前最新的 101 版本上作的修改,所以導致提交失敗。

如Tom修改file01.txt如下:
在這裏插入圖片描述
John修改file01.txt如下:
在這裏插入圖片描述當John選擇SVN提交之後,服務器上的Repository的file01.txt文件已變成了
在這裏插入圖片描述
於是當Tom進行SVN提交時,出現錯誤,並提示必須先更新工作副本:
在這裏插入圖片描述
注:這時候Tom進行更新時,不會影響Tom對文件的修改內容
Tom更新後,出現提示:

在這裏插入圖片描述
雙擊紅色的衝突位置,彈出比較界面:
在這裏插入圖片描述
上面左邊是服務器上file01.txt的最新版本,即John上傳的版本,上面右邊爲Tom修改的版本,在下面已合併的界面上右鍵,可彈出如下菜單:
在這裏插入圖片描述

  • 使用“他們的”文本塊:保留John的更改,捨棄Tom的更改;
  • 使用“我的”文本塊:保留Tom的更改,捨棄John的更改;
  • 先使用“我的”文本塊:同時保留John和Tom的更改,並將Tom的更改放在前面;
  • 先使用“他們的”文本塊:同時保留John和Tom的更改,並將John的更改放在前面;

比如,選擇“先使用我的文本塊”,可以看到已合併界面變成了:
在這裏插入圖片描述
Ctrl+S保存合併修改,彈出對話框,選擇標記爲解決
在這裏插入圖片描述關閉比較界面,在更新界面中可以看到,紅色標註的衝突已經變成了黑色的解決字樣:
在這裏插入圖片描述點擊確定按鈕,會再次彈出提交界面:
在這裏插入圖片描述添加提交信息後,可點擊確定按鈕進行提交,至此服務器中的Repository完成了John和Tom基於同一版本的修改後的合併操作。

五、文件鎖定與解鎖

以上衝突產生的原因是由於多個人同一時間對同一個文件改動的相互覆蓋,爲了避免這種情況,版本控制系統必須有一套衝突處理機制,一般策略有:樂觀加鎖嚴格加鎖

  • 樂觀加鎖:所有簽出的文件都是可讀寫的,對文件的修改不必獲得文件的鎖,當你修改完文件簽入時,會首先要求你更新本地文件,版本控制系統不會覆蓋你的本地修改,而是會讓你自己合併衝突後簽入。
  • 嚴格加鎖:所有簽出的文件都是隻讀的,任何對文件的修改必須要獲得文件的鎖,如果其他人沒有擁有該文件的鎖,那麼版本控制系統就會授權給你文件的鎖,並將文件設置爲可編輯的。

SVN使用的是樂觀加鎖策略。相比於嚴格加鎖,樂觀加鎖可能會有較高的產生衝突的概率,但允許團隊成員任何時間對文件進行編輯,擁有極大的協作效率。

5.1 使用TortoiseSVN獲取鎖和釋放鎖

SVN默認情況下,所有的文件都沒有鎖定,只要有提交權限的人都可以在任何時候提交任何的文件。其他人會定時更新他們的工作目錄,在庫中的改變的東西都會與本地合併。

如果你對一個文件獲得鎖定,那麼只有你可以提交這個文件。其他用戶的提交都會被拒絕,直到你釋放了這個鎖。

獲取鎖
選擇你想要獲取鎖定的文件或文件夾,然後右鍵菜單點擊TortoiseSVN->獲取鎖定(Get lock),將會彈出如下鎖定窗口,輸入對文件加鎖的原因,點擊確定按鈕,即可完成對文件的鎖定。
在這裏插入圖片描述此狀態下,如果其他用戶對file01.txt修改後提交的話,會出現如下錯誤:
在這裏插入圖片描述釋放鎖

有兩種情況會釋放鎖:

1、選擇你想要釋放鎖定的文件,然後右鍵菜單點擊TortoiseSVN->解除鎖定(Release lock);

2、TortoiseSVN爲了確保你不會忘記釋放鎖,在提交對話框中,總是會顯示鎖定的文件,並總是默認被選中。如果你繼續提交,選中的文件中的鎖就被移除了,就算你從沒有修改過。如果你不希望釋放文件的鎖,在提交的時候必須勾選“保持鎖定”。
在這裏插入圖片描述

存在的問題

使用TortoiseSVN 的“獲取鎖定(Get lock)”鎖定文件後,其他用戶並不知道你對這個文件已經鎖定,即使他們簽出最新的版本,依然能夠對文件在本地進行修改,文件依然是可讀寫的狀態,只有當他們在簽入時纔會發現文件已經被鎖定。

因此,在這種加鎖操作下,團隊成員需要定期的檢查文件的鎖定狀態,可以使用TortoiseSVN -> 檢查修改(check for modifications):
在這裏插入圖片描述

5.2 SVN嚴格加鎖

之所以存在被鎖定後其他成員依然可以在本地修改,是因爲SVN所採取的是樂觀加鎖的策略。如果我們想對某個文件或某個目錄採取嚴格加鎖策略,更明確的說是:所有文件默認爲只讀,在文件修改前需要先獲取鎖,只有其他人不擁有鎖時纔可以鎖定文件並修改。

要實現嚴格加鎖,就需要使用SVN的svn:needs-lock屬性。

在想要採取嚴格加鎖的文件或目錄上點擊右鍵,使用TortoiseSVN->屬性(Properties)菜單,點擊新建屬性,選擇需要鎖定(Needs-lock):
在這裏插入圖片描述在這裏插入圖片描述可以看到此時鎖定的文件前變成了灰色的對號,當設置了svn:needs-lock屬性時,實際上對文件就採取嚴格加鎖策略,對文件的任何修改都必須先使用TortoiseSVN 的 Get lock鎖定文件。

5.3 關於鎖的建議

對於項目中的二進制文件,如圖片、聲音、動態庫等,可以在目錄上統一設置svn:needs-lock屬性,避免在這些文件上產生衝突,浪費解決衝突的時間。

發佈了47 篇原創文章 · 獲贊 63 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章