天天看點

SVN:使用指令行模式通路SVN伺服器

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版本号并不是對某一個檔案進行編号,而是對應整個版本庫總體狀态的一個“快照”,取回某個版本不是取回版本号對應的某個檔案,而是整個項目的一個快照。

SVN:使用指令行模式通路SVN伺服器

1.6         将某個檔案恢複到某個版本中的狀态,同時不涉及其他檔案

①假設想要取回pp.txt在版本10時的狀态

②執行svn update指令

格式 svn update 檔案名 --revision 想要取回的版本号
舉例 svn update pp.txt –revision 10
運作結果

正在更新 'pp.txt':

U    pp.txt

更新到版本 10。

 ③綜合這兩個例子,我們可以認為版本号和檔案名構成了一個橫縱坐标系,通過檔案路徑和版本号定位其在某一個時刻的狀态。

SVN:使用指令行模式通路SVN伺服器