1.問題與案例
2.SVN簡介
3.應用環境
4.客戶端安裝
5.簡單應用
6.復雜應用
問題與案例(一)
電腦發生故障,文件沒有備份而丟失了
由於人員離職,導致某些資料丟失了
我怎么知道手頭的公共資料是不是最新版呢?
想要追溯幾個月前的某個狀態,卻發現那個版本的文件已經被當作垃圾刪除了
每天要花費很多時間來向別人提供需要共享的資料
相似的應用系統,每次都重復開發,難以復用
一個軟件被用於多個項目,發現其中存在一個BUG,所有這些項目都要進行修復
人員分布在兩地開發,版本如何同步
甲乙兩人為不同目的修改了同一份文件,乙的提交在甲提交之后,導致甲修改的內容丟失了
客戶測試發現了BUG,開發人員卻無法重現出來
SVN簡介(二)
一個開源的版本管理軟件
可架設在Apache上,使用http或https協議訪問;也可使用內置的svn協議訪問 在Windows環境下,最常用的客戶端為TortoiseSVN(簡稱TSVN)
在Linux/Unix環境下,用命令行方式操作
SVN的版本號指的不是某個文件的狀態,而是整個庫的狀態
應用環境(三)
服務器端:CollabNet的SVN服務器端安裝包(內含Apache2.2)
Windows客戶端:推薦使用TortoiseSVN(以下簡稱TSVN)
可通過TSVN進行讀、寫操作
可通過IE瀏覽器進行讀操作
可通過各種插件與開發工具集成
客戶端安裝(一)
安裝文件: TSVN客戶端: TortoiseSVN-1.6.8.19260-win32-svn-1.6.11.msi
TSVN中文語言包: LanguagePack_1.6.8.19260-win32-zh_CN.msi
全部選擇默認安裝,安裝完成后重啟電腦
TSVN通過右鍵菜單與Windows資源管理器集成,沒有自己的窗口界面
客戶端安裝(二)
TSVN通過右鍵菜單與Windows資源管理器集成,沒有自己的窗口界面
簡單應用
TSVN右鍵菜單與圖標
檢出
更新
提交
增加
刪除
改名
移動
TSVN右鍵菜單(一)
TSVN右鍵菜單(二)
TSVN圖標
檢出(一)
“檢出”用於客戶端第一次從SVN服務器上下載版本庫數據
在客戶端新建一個文件夾用於存放下載的數據
在新建文件夾上點右鍵,選擇“SVN檢出…”
檢出(二)
在彈出窗口的“版本庫URL”處填入版本庫的訪問地址,如:http://10.50.22.35:8080/svn/XXX部門/XXXX項目/
點“確定”開始從SVN服務器下載數據
更新
“更新”用於客戶端從SVN服務器下載最新版本
在受SVN控制的某層文件夾上(或文件夾內空白處)點右鍵,選擇“SVN更新”,TSVN自動比較該文件夾客戶端與服務器的版本差異,並下載最新版本到客戶端
提交(一)
“提交”用於將客戶端的改動上傳到SVN服務器
在受SVN控制的某層文件夾上(或文件夾內空白處,或某文件上)點右鍵,選擇“SVN提交…”
提交(二)
TSVN自動檢查該文件夾客戶端的改動,並將其列在彈出窗口的“變更列表”欄
在彈出窗口的“信息”欄寫上對此次提交的注釋,以便將來追溯
點擊“確定”將客戶端的改動上傳到服務器
增加(一)
“增加”用於將新文件或文件夾納入SVN的控制之下
在受SVN控制的某層文件夾上(或文件夾內空白處,或新增的某文件上)點右鍵,選擇 “TortoiseSVN-增加”
增加(二)
如果“增加”是對文件夾進行操作,則會彈出窗口列出該文件夾下未受控的文件,點擊“確定”將其納入SVN控制
“增加”后文件圖標從 變成
“增加”僅是對客戶端的文件進行標注,並不上傳到服務器,需要執行“提交”操作才會上傳
刪除(一)
“刪除”用於從當前版本中刪除文件或文件夾
在受SVN控制的文件夾中,通過Windows直接刪除子文件夾或文件
或:在受SVN控制的某層文件夾或文件上點右鍵,選擇“TortoiseSVN-刪除”
刪除(二)
“刪除”僅是對客戶端的文件進行操作,並不改變服務器上的內容,需要執行“提交”操作才會將刪除操作上傳到服務器
將“刪除”操作“提交”到服務器后,僅是從服務器的最新版本中刪除了此文件或文件夾,在歷史版本中仍可找回此文件或文件夾
改名(一)
“改名”用於在受SVN控制的狀態下,對文件或文件夾改名
在受SVN控制的某層文件夾或文件上點右鍵,選擇“TortoiseSVN-改名”
改名(二)
“改名”僅是對客戶端的文件進行操作,並不改變服務器上的內容,需要執行“提交”操作才會將改名操作上傳到服務器
不要用Windows“重命名”來實現改名,因為這個操作不受SVN控制,SVN會將其理解為刪除原文件、增加一個新文件,從而導致文件改名后不能跟蹤到改名前的狀態
改名(三)
改名的另一種方法:
在受SVN控制的某層文件夾或文件上點右鍵,選擇“TortoiseSVN-版本庫瀏覽器”
在彈出窗口右鍵點擊要改名的文件夾或文件,選擇“改名”
由於是對服務器版本庫直接操作,改名后將自動執行一次“提交”操作
改名完成后需要在客戶端執行一次“更新”,以下載最新狀態
移動(一)
“移動”用於在受SVN控制的狀態下,移動文件或文件夾的位置
在受SVN控制的某層文件夾或文件上點右鍵,選擇“TortoiseSVN-版本庫瀏覽器”
在彈出窗口拖動文件夾或文件到需要的位置
由於是對服務器版本庫直接操作,移動后將自動執行一次“提交”操作
移動完成后需要在客戶端執行一次“更新”,以下載最新狀態
移動(二)
不要用Windows的拖動操作或“剪切”、“粘貼”來實現移動,因為這些操作不受SVN控制,SVN會將其理解為在原位置刪除文件、在新位置增加文件,從而導致文件移動后不能跟蹤到移動前的狀態
復雜應用
更新至版本
還原
復原(回滾)
沖突及解決
分支/標記
合並
鎖定/解鎖
權限管理
更新至版本
“更新至版本”用於取出文件的某歷史版本
在受SVN控制的某層文件夾或文件上點右鍵,選擇“TortoiseSVN-更新至版本…”
在彈出窗口中填寫要取的版本號,點“確定”取回該版本
還原(一)
“還原”用於放棄“增加”、“刪除”、“改名”以及修改文件內容等客戶端的本地操作,將客戶端的數據恢復到改動前的版本狀態
在受SVN控制的某層文件夾或文件上點右鍵,選擇“TortoiseSVN-SVN還原…”
還原(二)
在彈出窗口中查看要還原的內容,點擊“確定”還原客戶端數據
“還原”只能用於執行“提交”操作之前,即未將客戶端的改變上傳到服務器之前
復原(回滾)(一)
復原(回滾)用於將項目恢復到之前的某個版本狀態,並在此版本基礎上繼續后面的工作
在受SVN控制的某層文件夾或文件上點右鍵,選擇“TortoiseSVN-顯示日志”
復原(回滾)(二)
在彈出的日志窗口中,右鍵點擊要復原的版本,選擇“復原到此版本”
復原結束后,執行“提交”操作,將此版本作為版本庫的最新版本
沖突及解決(一)
沖突的產生:
當兩人從同一個版本出發,修改同一份文件並提交時,這兩個修改版本就會發生沖突,后提交的人會收到發生沖突的提醒,且提交失敗,要求先進行更新操作
沖突及解決(二)
不會導致沖突 可能導致沖突
沖突及解決(三)
發生沖突后,執行“更新”操作后:
對於發生沖突的文件,TSVN會加上沖突標記
如果發生沖突的文件是二進制文件(如doc文件、jpg文件),TSVN會增加2個文件,分別是起始版本和發生沖突的版本
如果發生沖突的文件是文本文件(如c文件、txt文件),TSVN會將工作副本中的原文件改名增加“.mine”后綴,將兩個版本的沖突寫入原名文件(文件中用<<<<<<<、=======、>>>>>>>加以標識),並另外增加2個文件,分別是起始版本和發生沖突的版本
沖突及解決(四)
例如:兩人從第213版開始對start.c和SRS.doc進行修改,甲先修改完成並提交形成217版,乙隨后提交時發生沖突,則在乙的該文件夾下將會存在七個文件:
start.c:自動合並了甲和乙的修改內容的start.c
start.c.r213:甲乙修改前的start.c
start.c.r217:甲修改后的strat.c
start.c.mine:乙修改后的start.c
SRS.doc:乙修改后的SRS.doc
SRS.doc.r213 :甲乙修改前的SRS.doc
SRS.doc.r217:甲修改后的SRS.doc
沖突及解決(五)
解決沖突:
手工將前一版本中的修改整合到自己的文件中
在沖突的文件或文件夾上點右鍵,選擇 “Tortoise-已解決的…”,標記為沖突已解決(此時會自動刪除多余的文件),然后再次“提交”
分支/標記(一)
分支: “分支”通常用於在不同的線上同時工作的情況
“分支”通常設置為分支的所有者擁有讀寫權限,其他人員僅有讀取權限
標記 “標記”通常用於版本發布、標識基線狀態等情況
“標記”通常設置為配置管理員擁有讀寫缺陷,其他人員只有讀取權限
SVN使用同樣的操作進行“分支”和“標記”
分支/標記(二)推薦的目錄結構
分支/標記(三)案例一
分支/標記(四)案例二
分支/標記(五)案例三
分支/標記(六)創建分支
在受SVN控制的某層文件夾上點右鍵,選擇“TortoiseSVN-分支/標記…”
在彈出窗口的“至URL”欄,填寫分支的存放地址,通常將其存放到branches目錄下,並加上分支的名稱,如: http://10.50.22.35:8080/svn/軟件中心/project/branches/工行版
分支/標記(七)創建分支
在彈出窗口的“從此復制到版本庫”處選擇從“最新版本”或 “指定版本”或“工作副本”(工作副本可能是個混合版本)復制
在彈出窗口的“日志信息”欄填寫注釋信息,然后點擊“確定”
在對應的文件夾執行“更新”操作,下載分支到客戶端,之后對分支的操作均在此文件夾進行
分支/標記(八)創建標記
創建標記與創建分支類似,只是通常將其存放到tags目錄下,如:http://10.50.22.35:8080/svn/軟件中心/project/tags/Release_V1_0
標記實際是為某個版本做了個標簽,不會為另存一份而消耗服務器的存儲空間
合並(一)
合並:對兩個版本樹進行比較,然后將區別應用到本地副本(合並后需進行“提交”操作)
例如:在分支A上進行了一系列修改,現在要將這些修改合並到主干上,則可比較建立A分支的版本與A分支最終版本之間的差異,並將差異應用到主干上
可從分支合並到主干,也可從主干合並到分支,也可從分支A合並到分支B 可選擇合並創建分支以來的所有改變,也可選擇合並創建分支以來的某幾個版本的改變
合並(二)
在目標文件夾上點右鍵,如要將“branches/工行版”分支的內容合並到主干上,則在“trunk”文件夾上點右鍵,選擇“Tortoise-合並…”
在彈出窗口選擇“合並一個版本范圍”(常用選擇)
點擊“下一條”
合並(三)
在“合並的源URL”處選擇要合並進來的分支地址,如:http://10.50.22.35:8080/svn/軟件中心/project/branches/工行版
在“待合並的版本范圍”處填入合並的版本范圍,可點擊邊上的“顯示日志”選擇版本
點擊“下一條”
合並(四)
合並深度選擇默認的“工作副本”
“比較空白字符”、“忽略空白字符的變化”等選擇用於對文本文件的比較
“測試合並”可在正式合並之前測試合並結果,比如是否存在沖突等
點擊“合並” 若未發生沖突,可在合並后執行“提交”操作
合並(五)
若合並時發生沖突,通常可在彈出窗口選擇“以后解決”,在本地副本中沖突的文件處將增加2個文件(對二進制文件)或3個文件(對文本文件)
手動解決沖突后,使用“Tortoise-已解決的”標記沖突已解決,然后執行“提交”操作
鎖定/解鎖(一)
為了便於多人協作,SVN不提倡“鎖定-修改-解鎖”的方式
由於存在沖突解決的機制,通常多人可對同一份文件進行修改,而不會導致嚴重問題
但在某些情況下,比如對一張圖片進行修改時,兩份沖突的圖片文件將很難被整合到一起,這時建議用鎖定/解鎖的方式
鎖定/解鎖(二)
鎖定方法一
在需要鎖定的文件夾或文件上點右鍵,選擇“Tortoise-屬性”
在彈出的“屬性”窗口選擇“新建…”,在彈出的“增加屬性”窗口,選擇“svn:needs-lock”屬性,並點“確定”增加屬性
執行“提交”操作,將屬性的改變上傳到服務器,若他人執行更新操作,將看到文件被設置為只讀
鎖定/解鎖(三)
在設置了needs-lock屬性的文件或文件夾上點右鍵,選擇“SVN獲取鎖定…”,以獲取鎖的擁有權
在彈出窗口輸入鎖定的原因等注釋信息,然后點擊“確定”獲取鎖定
獲取鎖的擁有權后,文件將被標識為
鎖定/解鎖(三)
鎖定方法二
在要鎖定的文件或文件夾上點右鍵,選擇“Tortoise- 獲取鎖定”,即可鎖定並擁有其所有權,文件將被標識為
采用此鎖定方法時,並不會自動設定svn:needs-lock屬性,別人更新后也看不到此標記,但可阻止別人的提交
鎖定/解鎖(四)
鎖定后,他人提交時將被報告文件已被鎖,並提交失敗 解鎖:
對應鎖定方法一:在鎖定的文件夾或文件上點右鍵,選擇“Tortoise-屬性”,刪除svn:needs-lock屬性,然后提交
對應鎖定方法二:當擁有鎖的人提交被鎖定文件時,鎖將被自動取消(而且當前擁有的所有鎖都將被解除);也可通過“解除鎖定”來解鎖 竊取鎖:他人可通過“獲取鎖定” (勾選“偷取此鎖定”)來竊取鎖的擁有權
強制解鎖:當擁有鎖的人忘記解鎖時,他人可通過SVN命令行強制解鎖(TSVN目前不提供該功能,可通過竊取鎖+解鎖實現)
權限管理
管理員可通過修改服務器上的權限文件,實現對權限的控制
權限分為三種:無權限、只讀權限和讀寫權限
權限的控制以文件夾為最小單位
可對單個用戶的權限進行控制,也可以對用戶組的權限進行控制
SVN目錄結構