1.1 檢出
①首先進入自己的工作目錄,例如:D:\DevWorkSpace\SVNSpace
②運作svn checkout指令,指令格式如下
格式 | svn checkout svn://SVN伺服器主機位址/具體倉庫目錄 儲存檢出内容的目錄 |
舉例 | svn checkout svn://localhost/ERP MyERP |
運作結果 | 取出版本 0。 |
③工作副本
運作checkout指令後進入MyERP目錄,看到裡面什麼都沒有。真的什麼都沒有嗎?不是的。檢出指令會在這一目錄下建立一個隐藏目錄.svn,用來儲存與伺服器互動的重要資訊,其中包括從伺服器端取回的最新版本資訊、檔案狀态、更新時間等。SVN正是以此為依據判斷目前目錄中檔案的狀态。是以這個隐藏目錄千萬不要删除或修改其中的内容——完全無視它的存在吧。如果伺服器端儲存的檔案可以視為一個“正本”,那麼每個開發人員檢出到本地目錄的檔案可以視為“副本”,通常稱為工作副本。
1.2 送出
①進入D:\DevWorkSpace\SVNSpace\MyERP目錄
②建立一個檔案test.txt
③執行svn commit指令,運作結果是
D:\DevWorkSpace\SVNSpace\MyERP>svn commit test.txt svn: E200009: 送出失敗(細節如下): svn: E200009: “D:\DevWorkSpace\SVNSpace\MyERP\test.txt” 尚未納入版本控制 |
說明一個檔案必須納入版本控制才可以送出到伺服器端。
④執行svn add指令,将test.txt納入版本控制
D:\DevWorkSpace\SVNSpace\MyERP>svn add test.txt A test.txt |
⑤再次執行svn commit指令
D:\DevWorkSpace\SVNSpace\MyERP>svn commit test.txt svn: E205007: 送出失敗(細節如下): svn: E205007: 無法使用外部編輯器獲得日志資訊;考慮設定環境變量 $SVN_EDITOR,或者使用 --message (-m) 或 --file (-F) 選項 svn: E205007: 沒有設定 SVN_EDITOR,VISUAL 或 EDITOR 環境變量,運作時的配置參數中也沒有 “editor-cmd” 選項 |
此時要求附加日志資訊
⑥使用-m參數附加日志資訊
D:\DevWorkSpace\SVNSpace\MyERP>svn commit -m "My first commit" test.txt svn: E170001: 送出失敗(細節如下): svn: E170001: 認證失敗 |
原因是沒有權限
⑦暫時先開啟匿名通路權限
[1]進入對應的版本庫目錄下的conf目錄:D:\DevRepository\Subversion\ERP\conf
[2]打開svnserve.conf
[3]将第19行的#anon-access = read改為anon-access = write,也就是去掉“# ”,将read改為write。注意前面不要留白格,一定要頂格寫。
[4]不需要重新開機SVN服務,甚至指令行視窗都不需要重新打開。
⑧重新執行送出指令
D:\DevWorkSpace\SVNSpace\MyERP>svn commit -m "My first commit" test.txt 正在增加 test.txt 傳輸檔案資料. 送出後的版本為 1。 |
說明送出成功了。
⑨其實svn commit指令最後可以不指定具體檔案,此時表示送出目前工作副本中的所有修改。
1.3 更新
①将伺服器端檔案檢出到一個新的目錄,模拟另外一個終端
D:\DevWorkSpace\SVNSpace>svn checkout svn://localhost/ERP TomERP A TomERP\test.txt 取出版本 1。 |
②回到MyERP目錄,對test.txt檔案修改後送出。
③進入TomERP目錄
④執行svn update指令
D:\DevWorkSpace\SVNSpace\TomERP>svn update 正在更新 '.': U test.txt 更新到版本 2。 |
這樣我們就可以在TomERP目錄下看到MyERP目錄下送出的修改。
⑤思考:更新和檢出的相同點和不同點分别是什麼?
檢出 | 更新 | |
相同點 | 從伺服器端下載下傳最新内容 | |
不同點1 | 下載下傳整個項目 | 下載下傳與本地工作副本不同的内容 |
不同點2 | 建立.svn目錄,使檢出目錄成為工作副本 | 依賴.svn目錄 |
不同點3 | 隻能操作1次 | 可以操作多次 |
1.4 工作副本中檔案的幾種狀态
①沒有修改,現行版本
本檔案在工作目錄中沒有被修改,而且自目前版本之後,其他終端也沒有任何該檔案的修改被送出到伺服器,即目前工作副本的版本和伺服器端最新版本是一緻的。對它執行svn commit和svn update都不會發生任何事。
②本地修改, 現行版本
這個檔案被修改過,但這個修改還沒有送出到伺服器,而且自目前版本之後,其他終端也沒有任何該檔案的修改被送出到伺服器,是以目前工作副本的版本和伺服器端最新版本仍然是一緻的。由于有尚未送交回去的本地修改,是以對它的 svn commit會成功送出你的修改,而 svn update 則不會作任何事。
③沒有修改,過時版本
這個檔案沒有修改,但是版本庫中有其他終端送出的修改。此時目前工作副本的版本比伺服器端的版本落後了,我們稱之為“過時”。對目前檔案的 svn commit 不會發生任何事,而 svn update 會讓工作目錄中的檔案更新至最新版本。
④本地修改,過時版本
伺服器端存在沒有更新到本地的修改,導緻目前版本過時。如果這個檔案在本地有未送出的修改,則無法送出,對它執行svn commit 會産生“out-of-date”錯誤。
此時應該先嘗試更新本地檔案。更新時SVN會嘗試将伺服器端的更新與本地檔案進行合并,合并的結果有兩種可能:一個是伺服器端和本地修改位于檔案的不同位置,合并成功;另一個是伺服器端的修改正好和本地修改位于同一個位置,發生沖突。
1.5 将工作副本整體回複到某一個曆史版本
①假設目前版本為12,想要取回版本9
②執行svn update指令
格式 | svn update --revision 想要取回的版本号 |
舉例 | svn update --revision 1 |
運作結果 | 正在更新 '.': D pp.txt U test.txt 更新到版本 1。 |
③這裡需要注意的是,SVN版本号并不是對某一個檔案進行編号,而是對應整個版本庫總體狀态的一個“快照”,取回某個版本不是取回版本号對應的某個檔案,而是整個項目的一個快照。

1.6 将某個檔案恢複到某個版本中的狀态,同時不涉及其他檔案
①假設想要取回pp.txt在版本10時的狀态
②執行svn update指令
格式 | svn update 檔案名 --revision 想要取回的版本号 |
舉例 | svn update pp.txt –revision 10 |
運作結果 | 正在更新 'pp.txt': U pp.txt 更新到版本 10。 |
③綜合這兩個例子,我們可以認為版本号和檔案名構成了一個橫縱坐标系,通過檔案路徑和版本号定位其在某一個時刻的狀态。