SVN之于GIT的理論優勢

目錄
使用SVN管理代碼
SVN
用戶端:TortoiseSVN
伺服器:VisualSVN Server
管理證書
建立使用者、使用者組
建立倉庫
下載下傳倉庫(checkout)
送出(push)、更新(pull)
檢視曆史記錄
本地撤銷、撤銷曆史送出、回退版本
忽略檔案(本地變化)
建立分支(雲端變化)
合并分支
解決沖突
備份
SVN托管平台
展開
官網:https://subversion.apache.org/
SVN(SubVersion)是Apache下一個開源的中心化版本控制系統,采用用戶端/伺服器架構存放項目倉庫(倉庫 = 代碼 + 曆史)。和分布式的Git相比,中心化的SVN有以下的諸多特點:
·中心化架構,輕量簡單,适合中小規模的項目
·用戶端本地不存儲曆史檔案,節省空間(已有的記錄不會自删)
·SVN更像是一個公共雲端檔案系統,使用http/DAV協定驅動
·擁有連續的整數版本号(修訂号)
·弱化了“分支”的概念,svn分支實質上就是檔案夾的拷貝,友善切換
·中心化的管理模式允許更精細的權限劃分
·每一級目錄都可以單獨同步
·中心化存儲易造成單點故障,需要定期備份
官網:https://tortoisesvn.net/
TortoiseSVN是Windows下最流行的SVN用戶端GUI工具,它的特點是基于Windows Explorer(檔案資料總管),通過檔案圖示,上下文菜單等形式實作SVN的功能,不用打開額外的應用程式。
官網:https://www.visualsvn.com/server/
VisualSVN Server是Windows下一個簡單易上手的SVN伺服器兼GUI軟體,支援web通路。
服務啟動後,Visual SVN會自動在系統的“證書管理器”中添加一份以主機名為域名的根證書,證書的位置為“受信任的根證書頒發機構”,也就是非出廠自帶的第三方自簽名證書的存放位置。可以通過https安全通路這個域名,如下圖是我的主機名證書。
VisualSVN Server推薦用https,預設是基于主機名臨時簽發的自簽名證書,可以在設定中更換。同時推薦在network面闆中勾選“Automatically redirect HTTP to HTTPS(listen on port 80)”相容http。
打開VisualSVN Server Manager,添加使用者。使用者名和密碼即可以下載下傳svn倉庫,也可以登入web網頁。
點選添加使用者組,輸入組名,添加組成員。
後期可在任何檔案夾的Properties中設定任何使用者/使用者組的讀/寫權限。
打開VisualSVN Server Manager,添加倉庫。倉庫類型選擇第一個正常FSFS即可,第二個VDFS是VisualSVN基于FSFS的私有格式,一般用不到。
選擇空倉庫,後期根據項目需求設定目錄結構,不必采用trunk、branches、tags的結構。
初始化使用者權限,選擇預設,以後再根據不同的目錄結構配置設定權限。
複制倉庫的URL位址,在檔案資料總管或桌面空白處右鍵點選SVN checkout。
輸入倉庫的URL以及拷貝到本地的位置,Fully recursive指遞歸拷貝所有檔案,HEAD revision指最新版本。
下載下傳成功後,本地目錄中有一個.svn的隐藏目錄是用來存放倉庫的中繼資料,不要碰它。
空白處右鍵菜單中,SVN Update是從雲端拉最新代碼,SVN Commit是送出本地更新的代碼。送出面闆中,在Changes made中勾選需要送出的檔案,或點選All全選。
注意,如果選中某個檔案點選更新(而不是空白處),隻會更新這個檔案。
可以從用戶端(Tortoise)和網頁端(Visual)2種途徑檢視倉庫的曆史記錄。
1.TortoiseSVN用戶端上選擇show log
2.浏覽器中通路VisualSVN網頁端
·本地撤銷:撤銷本地未送出的更新
·撤銷曆史送出:撤銷某次送出的變更,可能引起沖突
·回退版本:恢複到某個版本,相當于若幹次“撤銷曆史送出”
這3個概念容易混淆(3者的英文都包含“Revert”),首先,“本地撤銷”就是将所有還未送出的變動撤銷掉,對雲端無任何影響:上下文菜單中點選Revert,然後選擇要撤銷的檔案。
之後可以觀察到檔案圖示的變化:
然後,“撤銷曆史送出”是指選擇曆史記錄中的某條記錄,撤銷該條記錄的變更,形成新的變更,如果這條記錄是很久以前的,撤銷時候可能會引起沖突。同樣會形成新變更的是“回退版本”,後者實質上是若幹次“撤銷曆史送出”的總和,即指定版本到最新版本之間的每次送出,是以“回退版本”不會引起沖突。
這兩個操作需要在曆史記錄視窗中選擇某曆史版本,右鍵選擇Revert changes from this revision或者Revert to this revision。
Git通過.gitignore忽略檔案,TortoiseSVN通過對檔案右鍵菜單中選擇TortoiseSVN > Add to ignore list來實作,tortoise會幫你添加進svn:global-ignore中。
注意,忽略設定完後要送出,以同步雲端(目錄的屬性變化)。
SVN中建立分支的實質就是拷貝目錄,是以有多種方式可以切分支,最簡單的方式是在TortoiseSVN的Repo-browser中,對想要拷貝的目錄(可以是根目錄)右鍵選擇copy to拷貝到新目錄,進而建立所謂的分支。
注意,拷貝後隻在服務端生效,需要SVN update一下同步到本地。
和Git一樣,SVN有好幾種合并的方式,但多數情況下都是把分支中的修改合并到主幹上來,本文隻介紹這一種主要情況:在主幹目錄右鍵選擇merge,選擇第一個選項Merge a range of revisions。
一路下一步确定源和目标的範圍,最後點選Test merge測試是否有沖突,如果沒有則順利合并。
注意:可以合并檔案也可以合并整個檔案夾。
無論是拉代碼還是合并代碼都有可能出現沖突,按照官方的說法,有3種類型的沖突:
·檔案沖突:通常發生在檔案同一行被多個人修改後
·屬性沖突:檔案/檔案夾屬性被改變時,比如忽略屬性
·樹沖突:移動/删除/重命名時易發生
注意,建議養成每次開始改動前先更新代碼的習慣,進而減少沖突的可能性。
因為SVN“中心化”的天然特性,需要定期備份避免資料丢失。在VisualSVN Server上對某個倉庫選擇Backup,存儲為.vsvnbak格式的檔案,最好發送到其他機器上。
·Github對SVN的支援:https://docs.github.com/en/github/importing-your-projects-to-github/support-for-subversion-clients
·SVNBucket(國内):https://svnbucket.com/
·SilkSVN:https://sliksvn.com/
(SVN真香)