版本控制器:SVNhtml
1 開發中的實際問題java
1.1 小明負責的模塊就要完成了,就在即將Release以前的一瞬間,電腦忽然藍屏,硬盤光榮犧牲!幾個月來的努力付之東流——需求之一:備份!程序員
1.2 這個項目中須要一個很複雜的功能,老王摸索了一個星期終於有眉目了,但是這被改得面目全非的代碼已經回不到從前了。什麼地方能買到哆啦A夢的時光機啊?需求之二:代碼還原!算法
1.3 小剛和小強前後從文件服務器上下載了同一個文件:Analysis.java。小剛在Analysis.java文件中的第30行聲明瞭一個方法,叫count(),先保存到了文件服務器上;小強在Analysis.java文件中的第50行聲明瞭一個方法,叫sum(),也隨後保存到了文件服務器上,因而,count()方法就只存在於小剛的記憶中了——需求之三:協同修改!apache
1.4 老許是一位項目經理,我會告訴你他把每個版本都保存一份嗎?我會告訴你這些工程裏其實有不少文件都是重複的嗎?我會告訴你老許爲這事刪了不少電影嗎?——需求之四:多版本項目文件管理!服務器
1.5 老王是另外一位項目經理,每次由於項目進度捱罵以後,他都不知道該扣哪一個程序員的工資!就拿此次來講吧,有個該死的Bug調試了30多個小時才知道是由於相關屬性沒有在應用初始化時賦值!但是二胖、王東、劉流和正經牛都不認可是本身乾的!——需求之五:追溯問題代碼的編寫人和編寫時間!網絡
1.6 小溫這兩天幸福的如同掉進了蜜罐裏,由於他成功的獲得了前臺MM麗麗的芳心,可他鬱悶的是這幾天老是收到QA小組的郵件,要求他修正程序中存在的Bug,可他本身本地電腦上是沒有這些Bug的,「難道個人代碼被哪一個孫子給改了?」。是的,小溫沒來的時候,麗麗是QA小組小鄭的女友啊!——需求之六:權限控制!eclipse
2 版本控制簡介編輯器
2.1 版本控制[Revision control],最初來源於工程設計領域,是維護工程藍圖的標準作法,能追蹤工程藍圖從誕生一直到定案的過程。是一種記錄若干文件內容變化,以便未來查閱特定版本修訂狀況的系統。svn
2.2 Subversion就是一款實現版本控制的工具軟件,一般也稱爲版本控制器,簡稱SVN。Subversion是Apache軟件基金會組織下的一個項目。
2.3 Subversion的優良特性
①目錄版本控制
CVS只能追蹤單個文件的歷史,可是Subversion實現了一個「虛擬」文件系統,能夠追蹤整個目錄樹的修改,文件和目錄都是版本控制的,結果就是能夠在客戶端對文件和目錄執行移動和複製命令。
②原子提交
提交要麼徹底進入版本庫,要麼一點都沒有,這容許開發者以一個邏輯塊提交修改。
③版本控制的元數據
每一個文件和目錄都有一組附加的「屬性」,你能夠發明和保存任意的鍵/值對,屬性也會像文件內容同樣被歸入版本控制。
④可選的網絡層
Subversion在版本庫訪問方面有一個抽象概念,利於人們去實現新的網絡機制,Subversion的「高級」服務器是 Apache 網絡服務器的一個模塊,使用 HTTP 的變種協議 WebDAV/DeltaV 通信,這給了 Subversion 在穩定性和交互性方面很大的好處,能夠直接使用服務器的特性,例如認證、受權、傳輸壓縮和版本庫瀏覽等等。也有一個輕型的,單獨運行的 Subversion 服務器,這個服務器使用本身的協議,能夠輕鬆的用 SSH 封裝。
⑤一致的數據處理
Subversion使用二進制文件差別算法展示文件的區別,對於文本(人類可讀)和二進制(人類不可讀)文件具有一致的操做方式,兩種類型的文件都壓縮存放在版本庫中,差別在網絡上雙向傳遞。
⑥高效的分支和標籤
分支與標籤的代價不與工程的大小成比例,Subversion創建分支與標籤時只是複製項目,使用了一種相似於硬連接的機制,於是這類操做一般只會花費不多而且相對固定的時間,以及很小的版本庫空間。
2.4 SVN的工做原理:採起客戶端/服務器模式——在服務器的版本庫中保存項目文件的各個版本,全部參與協同開發的程序員在本身本地電腦上保存一個工做副本。SVN支持程序員將本地副本更新到服務器端的最新版本,也支持將本地副本的最新改變動新到服務器端,並且後面的更新不會覆蓋前面的更新,而是做爲一個新的版本被保存下來——SVN甚至支持將本地工做副本恢復爲服務器端保存的某一個歷史版本。
2.5 SVN基本操做
①檢出(checkout):將一個服務器端建立好的項目整個下載到本地,這是到項目組後參與開發的第一步,只需執行一次。
②更新(update):將本地文件更新爲服務器端的最新版本,一般爲天天上班時或修改公共文件以前執行一次。
③提交(commit):將本地修改提交到服務器端。一般天天下班前或每實現一個功能、完成一個模塊時執行一次。
3 Subversion安裝與配置
3.1 安裝服務器端程序
①服務器端程序版本
目前Subversion的最新版本是 1.9.0-alpha2,這是一個測試版。官方網站推薦使用的版本是1.8.9,原話是:The best available version of Apache Subversion is: 1.8.9
②下載源碼包
Apache組織本身維護更新的只是Subversion的源碼,各個版本的源碼包的下載地址是:http://subversion.apache.org/download/
Subversion源碼是使用C語言開發的。
③下載二進制安裝包
Subversion在不一樣平臺下的二進制包是由不一樣組織構建實現的,Windows平臺下的二進制包實現狀況以下:
因此,服務器端程序的下載地址可使用:
http://sourceforge.net/projects/win32svn/files/latest/download
下載到的文件是:Setup-Subversion-1.8.9-1.msi
④雙擊運行Setup-Subversion-1.8.9-1.msi
不整合Apache服務器能夠忽略此選項
⑤安裝程序會自動配置Path環境變量
D:\DevInstall\Subversion\bin
因此bin目錄下的可執行文件能夠在任意目錄下運行。
⑥驗證是否安裝成功
在命令行輸入:svn --version
看到以下信息就表示服務器端程序安裝成功
3.2 配置版本庫
①爲何要配置版本庫?
Subversion是將文件數據信息保存到版本庫中進行管理的,爲了知足用戶的不一樣需求,Subversion容許用戶對版本庫目錄進行定製。
②在一個非中文無空格目錄下建立一個文件夾,做爲版本庫的根目錄。
例如:D:\DevRepository\Subversion
③在版本庫根目錄下建立與具體項目對應的子目錄——這樣作的目的是使一個SVN服務器可以同時管理多個項目,而不是爲每個項目搭建一個SVN服務器——這顯然太浪費資源了。
例如:D:\DevRepository\Subversion\CRM
D:\DevRepository\Subversion\ERP
D:\DevRepository\Subversion\OA
④建立版本庫
命令格式
主命令 |
子命令 |
參數1 |
svnadmin |
create |
倉庫路徑 |
舉例 |
svnadmin create D:\DevRepository\Subversion\StuSys |
⑤版本庫目錄結構
版本庫建立成功後會在指定目錄下產生以下的目錄結構
3.3 啓動服務器端程序
①SVN服務器必須處於運行狀態才能響應客戶端請求,幫助咱們管理項目文件。因此咱們必須將SVN服務器啓動起來。啓動SVN 服務器有兩種方法,一個是命令行方式,一個是註冊Windows服務。
②命令行方式
[1]命令格式
主命令 |
參數1 |
參數2 |
參數3 |
svnserve |
-d表示後臺執行 |
-r表示版本庫根目錄 |
D:\DevRepository\Subversion |
舉例 |
svnserve -d -r D:\DevRepository\Subversion |
[2]驗證服務是否啓動
SVN服務監聽3690端口,打開一個新的cmd窗口,使用netstat -an 命令查看3690端口是否被監聽
[3]命令行方式的缺陷是:只要運行服務器端程序的命令行窗口一關閉,服務就中止了,很不方便,並且每次開機都須要手動啓動。
③註冊Windows服務
[1]將SVN服務端程序註冊爲Windows服務,就可讓SVN服務隨系統一塊兒啓動,克服了命令行方式的不足。
[2]註冊Windows服務須要利用XP、2000以上系統自帶工具Service Control,執行文件是sc.exe,注意這個命令不是SVN的命令。
[3]命令格式
主命令 |
子命令 |
參數1 |
參數2 |
參數3 |
參數4 |
sc |
create |
服務名 |
binpath= 「運行服務所須要的二進制文件路徑以及運行該二進制文件的命令行參數」 |
start= auto 表示自動啓動 |
depend= Tcpip 表示依賴Tcpip協議 |
[注意:在這個命令中,等號左邊都沒有空格,右邊都有一個空格!] |
[4]binpath組成結構說明
svnserve.exe路徑 |
svnserve命令參數1 |
svnserve命令參數2 |
svnserve命令參數3 |
SVN安裝目錄\bin\svnserve.exe |
--service 表示以服務方式啓動Subversion |
-r 表示版本庫根目錄 |
版本庫目錄 |
[5]關於「版本庫目錄」
單倉庫 |
指定與具體項目對應的倉庫目錄 |
例如:D:\DevRepository\Subversion\CRM |
只能爲一個項目服務 |
多倉庫 |
指定版本庫的根目錄 |
例如:D:\DevRepository\Subversion |
能夠爲多個項目服務 |
[6]最終命令舉例
sc create MySVNService binpath= "D:\DevInstall\Subversion\bin\svnserve.exe --service -r D:\DevRepository\Subversion" start= auto depend= Tcpip |
●在Win7及以上系統中,運行該命令須要管理員權限,不然會獲得以下錯誤提示
●解決的辦法是以管理員身份運行cmd命令行窗口便可
●在防火牆或電腦衛士提示阻止時,選擇容許
●此時查看當前系統中的服務,能夠看到咱們剛剛建立的服務,但此時它尚未啓動,若是建立失敗,需檢查sc命令是否正確
●啓動此服務
啓動服務的命令格式以下:
格式 |
sc start 服務名 |
舉例 |
sc start MySVNService |
●打開命令行窗口運行netstat –an查看3690端口是否被監聽
●若是啓動失敗,那頗有多是binpath中的內容有錯誤,此時只能將已經建立的服務刪除,從新建立。
●刪除服務以前,最好先中止服務。中止服務的命令格式以下:
格式 |
sc stop 服務名 |
舉例 |
sc stop MySVNService |
●刪除服務的命令格式以下:
格式 |
sc delete 服務名 |
舉例 |
sc delete MySVNService |
●刪除、啓動、中止服務一樣須要管理員權限
4 使用命令行模式訪問SVN服務器
4.1 檢出
①首先進入本身的工做目錄,例如:D:\DevWorkSpace\SVNSpace
②運行svn checkout命令,命令格式以下
格式 |
svn checkout svn://SVN服務器主機地址/具體倉庫目錄 保存檢出內容的目錄 |
舉例 |
svn checkout svn://localhost/ERP MyERP |
運行結果 |
取出版本 0。 |
③工做副本
運行checkout命令後進入MyERP目錄,看到裏面什麼都沒有。真的什麼都沒有嗎?不是的。檢出命令會在這一目錄下建立一個隱藏目錄.svn,用來保存與服務器交互的重要信息,其中包括從服務器端取回的最新版本信息、文件狀態、更新時間等。SVN正是以此爲依據判斷當前目錄中文件的狀態。因此這個隱藏目錄千萬不要刪除或修改其中的內容——徹底無視它的存在吧。若是服務器端保存的文件能夠視爲一個「正本」,那麼每一個開發人員檢出到本地目錄的文件能夠視爲「副本」,一般稱爲工做副本。
4.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命令最後能夠不指定具體文件,此時表示提交當前工做副本中的全部修改。
4.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次 |
能夠操做屢次 |
4.4 工做副本中文件的幾種狀態
①沒有修改,現行版本
本檔案在工做目錄中沒有被修改,並且自當前版本以後,其餘終端也沒有任何該文件的修改被提交到服務器,即當前工做副本的版本和服務器端最新版本是一致的。對它執行svn commit和svn update都不會發生任何事。
②本地修改, 現行版本
這個文件被修改過,但這個修改尚未提交到服務器,並且自當前版本以後,其餘終端也沒有任何該文件的修改被提交到服務器,因此當前工做副本的版本和服務器端最新版本仍然是一致的。因爲有還沒有送交回去的本地修改,因此對它的 svn commit會成功提交你的修改,而 svn update 則不會做任何事。
③沒有修改,過期版本
這個文件沒有修改,可是版本庫中有其餘終端提交的修改。此時當前工做副本的版本比服務器端的版本落後了,咱們稱之爲「過期」。對當前文件的 svn commit 不會發生任何事,而 svn update 會讓工做目錄中的文件更新至最新版本。
④本地修改,過期版本
服務器端存在沒有更新到本地的修改,致使當前版本過期。若是這個文件在本地有未提交的修改,則沒法提交,對它執行svn commit 會產生「out-of-date」錯誤。
此時應該先嚐試更新本地文件。更新時SVN會嘗試將服務器端的更新與本地文件進行合併,合併的結果有兩種可能:一個是服務器端和本地修改位於文件的不一樣位置,合併成功;另外一個是服務器端的修改正好和本地修改位於同一個位置,發生衝突。
4.5 將工做副本總體回覆到某一個歷史版本
①假設當前版本爲12,想要取回版本9
②執行svn update命令
格式 |
svn update --revision 想要取回的版本號 |
舉例 |
svn update --revision 1 |
運行結果 |
正在升級 '.': D pp.txt U test.txt 更新到版本 1。 |
③這裏須要注意的是,SVN版本號並非對某一個文件進行編號,而是對應整個版本庫整體狀態的一個「快照」,取回某個版本不是取回版本號對應的某個文件,而是整個項目的一個快照。
4.6 將某個文件恢復到某個版本中的狀態,同時不涉及其餘文件
①假設想要取回pp.txt在版本10時的狀態
②執行svn update命令
格式 |
svn update 文件名 --revision 想要取回的版本號 |
舉例 |
svn update pp.txt –revision 10 |
運行結果 |
正在升級 'pp.txt': U pp.txt 更新到版本 10。 |
③綜合這兩個例子,咱們能夠認爲版本號和文件名構成了一個橫縱座標系,經過文件路徑和版本號定位其在某一個時刻的狀態。
5 單一版本庫權限配置
5.1 匿名訪問:前已述及。
5.2 受權訪問
①要設置受權訪問就須要建立用戶,併爲用戶設定權限
②打開受權訪問的配置
[1]打開D:\DevRepository\Subversion\ERP\conf\svnserve.conf
[2]將第19行anon-access = write註釋掉:# anon-access = write
代表該版本庫不接受匿名訪問
[3]將第20行# auth-access = write註釋打開:auth-access = write
代表該版本庫使用受權訪問
[4]將第27行註釋打開:password-db = passwd
代表使用同目錄下的passwd文件保存用戶信息
[5]將第36行註釋打開:authz-db = authz
代表使用同目錄下的authz文件保存權限信息
[6]打開passwd文件建立用戶
userWrite01 = 123456 userWrite02 = 123456 userRead = 123456 userOther = 123456 |
[7]打開authz文件:#後面註釋的是例子
<1>建立用戶組
[groups] # harry_and_sally = harry,sally # harry_sally_and_joe = harry,sally,&joe canWrite = userWrite01,userWrite02 |
<2>指定路徑,給用戶和用戶組受權
# [/foo/bar] # harry = rw # &joe = r # * =屏蔽那些未設定的用戶,讓它們沒有任何權限 [/] @canWrite = rw userRead = r * = |
<3>權限的繼承性:父目錄設置的權限,對子目錄一樣有效——除非子目錄進行了更爲具體的設定
[/subDir] userOther = rw * = |
這個例子表示當前版本庫下的subDir目錄只有userOther有讀寫權限,其它用戶無任何權限
6 多版本庫共享配置
6.1 在版本庫根目錄D:\DevRepository\Subversion下建立commConf目錄
6.2 將未修改的authz和passwd文件拷貝到commConf目錄下
6.3 修改須要設置權限的版本庫的svnserve.conf文件
①password-db = ../../commConf/passwd
②authz-db = ../../commConf/authz
6.4 在password中建立用戶
[users] # harry = harryssecret # sally = sallyssecret
userERP = 123456 userOA = 123456 userCRM = 123456 |
6.5 在authz中針對不一樣版本庫爲不一樣用戶授予權限
# [repository:/baz/fuz] # @harry_and_sally = rw # * = r
[ERP:/] userERP = rw * =
[OA:/] userOA = rw * =
[CRM:/] userCRM = rw * = |
7 查看工做副本信息
①使用svn info命令
②執行效果以下
D:\DevWorkSpace\SVNSpace\MyCRM>svn info 路徑: . 工做副本根目錄: D:\DevWorkSpace\SVNSpace\MyCRM URL: svn://localhost/CRM 正確的相對 URL: ^/ 版本庫根: svn://localhost/CRM 版本庫 UUID: d5768329-0587-f54a-b44e-72a9a02ddf1b 版本: 12 節點種類: 目錄 調度: 正常 最後修改的做者: userCRM 最後修改的版本: 12 最後修改的時間: 2014-08-08 00:30:38 +0800 (週五, 2014-08-08) |
③對某一個文件使用svn info命令
D:\DevWorkSpace\SVNSpace\MyCRM\src\com\atguigu\crm>svn info MyCRM.java 路徑: MyCRM.java 名稱: MyCRM.java 工做副本根目錄: D:\DevWorkSpace\SVNSpace\MyCRM URL: svn://localhost/CRM/src/com/atguigu/crm/MyCRM.java 正確的相對 URL: ^/src/com/atguigu/crm/MyCRM.java 版本庫根: svn://localhost/CRM 版本庫 UUID: d5768329-0587-f54a-b44e-72a9a02ddf1b 版本: 14 節點種類: 文件 調度: 正常 最後修改的做者: userCRM 最後修改的版本: 14 最後修改的時間: 2014-08-08 00:36:06 +0800 (週五, 2014-08-08) 文本最後更新: 2014-08-08 00:35:59 +0800 (週五, 2014-08-08) 校驗和: dbea85a617fb59cb739c3d18968a941d32858372 |
8 查看目錄或文件日誌信息
①使用svn log命令
[注意:使用這個命令的前提是設置匿名訪問爲none,即:anon-access = none,不然會出現「svn: E220001: 條目不可讀」錯誤]
②執行效果以下
D:\DevWorkSpace\SVNSpace\MyCRM\src\com\atguigu\crm>svn log MyCRM.java ------------------------------------------------------------------------ r18 | userCRM | 2014-08-08 09:43:00 +0800 (週五, 2014-08-08) | 4 行
aaa bbb ccc ddd ------------------------------------------------------------------------ r17 | userCRM | 2014-08-08 09:36:46 +0800 (週五, 2014-08-08) | 1 行
aaaa\nbbb\ntt ------------------------------------------------------------------------ r16 | userCRM | 2014-08-08 09:30:26 +0800 (週五, 2014-08-08) | 1 行
------------------------------------------------------------------------ r15 | userCRM | 2014-08-08 00:58:30 +0800 (週五, 2014-08-08) | 1 行
------------------------------------------------------------------------ r14 | userCRM | 2014-08-08 00:36:06 +0800 (週五, 2014-08-08) | 1 行
tt ------------------------------------------------------------------------ r13 | userCRM | 2014-08-08 00:33:12 +0800 (週五, 2014-08-08) | 1 行
tt ------------------------------------------------------------------------ r4 | userCRM | 2014-08-07 22:19:16 +0800 (週四, 2014-08-07) | 1 行
------------------------------------------------------------------------ r2 | (沒有做者信息) | 2014-08-05 11:37:29 +0800 (週二, 2014-08-05) | 1 行
tt ------------------------------------------------------------------------ r1 | (沒有做者信息) | 2014-08-05 11:34:40 +0800 (週二, 2014-08-05) | 1 行
tt ------------------------------------------------------------------------ |
9 在Eclipse中安裝SVN客戶端插件
9.1 Eclipse插件應用市場
在Eclipse中訪問Eclipse Marketplace Client能夠搜索Subversion,下載插件,按提示安裝便可。
9.2 使用壓縮包
若是不能聯網可使用下載好的插件壓縮包eclipse_svn_site-1.10.5.zip,這個壓縮包是從http://subclipse.tigris.org/網站(subclipse是這款Eclipse插件的名稱)上下載的。安裝方法是:
①解壓eclipse_svn_site-1.10.5.zip中的features和plugins這兩個目錄
②將features和plugins複製到Eclipse安裝目錄/dropins/eclipse_svn_site-1.10.5下
③重啓Eclipse
④進入Eclipse依次打開Window→Preferences→Team→SVN,看到以下界面即說明SVN插件安裝成功
9.3 建立資源庫位置
①切換到透視圖SVN資源庫研究
②建立資源庫位置
此時能夠查看版本庫中的文件及目錄結構
9.4 檢出
①檢出分兩種狀況
<1>從服務器端獲取到的是一些零散的文件,不能做爲項目檢出
此時會彈出一個新建項目嚮導,之因此會這樣是由於咱們須要建立一個項目來保存從服務器端取回的文件
<2>從服務器端獲取到的是一個完整的項目,例如
此時必須做爲項目檢出
項目從服務器檢出後,會成爲一個工做副本,根目錄下會自動建立.svn隱藏目錄
9.5 提交
①新建立文件後,文件圖標上會以「?」標識,表示該文件還沒有歸入版本控制
②在新建立的文件上點右鍵→Team→添加至版本控制,這樣文件圖標上會顯示「+」,表示當前文件已歸入版本控制,但還未提交至服務器。
③在要提交的文件上點右鍵→Team→提交...會提交文件,在彈出的對話框中能夠不填寫日誌。文件提交後,圖標會變爲「金色的圓柱體」表示當前文件的版本和服務器端一致。
④文件修改後圖標會變爲「*」,表示當前文件或目錄包含未提交的修改。
9.6 更新
①更新整個項目時能夠在項目上點右鍵→Team→更新
②更新某個具體的文件時,能夠在文件上點右鍵→Team→更新
9.7 共享項目
①在Eclipse中建立的新項目想要發佈到SVN服務器端,能夠經過「共享」項目實現
②在項目上點右鍵→Team→Share Project...→選擇一種版本控制工具
選擇一個資源庫位置
切換到Team Synchronizing透視圖,選擇項目中要提交的內容,一般是項目中的所有內容
9.8 回覆歷史版本
①在須要回覆的文件上點右鍵→Team→顯示資源歷史記錄→獲得以下界面
②選擇某一個歷史記錄點右鍵→獲取內容。文件就會恢復到指定版本的狀態,同時圖標變爲「*」。
③獲取歷史記錄時,若是出現以下錯誤提示
能夠經過將對應版本庫中的svnserve.conf文件中的anon-access設置爲none解決。
9.9 解決衝突
①什麼狀況下會發生衝突
<1>兩個開發人員,Harry和Sally,分別從服務器端下載了文件A。
<2>Harry修改以後,A變成了A’,Sally修改以後,A變成了A’’。
<3>Harry先一步提交,使服務器端文件的版本也變成了A’
<4>Sally本地的文件A’’已通過時了,此時她已沒法提交文件,服務器會要求她先進行一次更新操做。
<5>此時Sally的更新操做有兩種可能
(1)Sally所作的修改與Harry不是同一個位置,更新操做嘗試合併文件成功。
(2)Sally所作的修改與Harry剛好是同一個位置,更新操做嘗試合併文件失敗,發生衝突。
<6>發生衝突後,本地工做副本會發生以下變化
(1)文件A中的內容發生以下改變
public static void main(String[] args) { System.out.println("Edit By Command!"); System.out.println("Edit By Command!"); <<<<<<< .mine System.out.println("Edit By Eclipse!"); ======= System.out.println("Edit By Command!New Edit"); >>>>>>> .r14 System.out.println("Edit By Command!"); System.out.println("Edit By Command!"); } |
其中,從<<<<<<< .mine到=======之間是發生衝突時本地副本的內容。從=======到>>>>>>> .r14是發生衝突時服務器端的最新內容。注意這裏r後面的數字是發生衝突時服務器端的版本號,有多是任何整數值,r14只是一個例子。
同時文件圖標變成一個「黃色的!」。
(2)與衝突文件同目錄下新增文件,擴展名爲.mine,其內容是發生衝突時本地副本的文件內容。
(3)與衝突文件同目錄下新增文件,擴展名爲.r小版本號,例如MyCRM.java.r13,其內容是衝突發生以前,服務器端的文件內容,能夠做爲解決衝突的參照。
(4)與衝突文件同目錄下新增文件,擴展名爲.r大版本號,例如MyCRM.java.r14,其內容是衝突發生時,服務器端的文件內容。
②解決衝突
(1)在衝突文件上點右鍵→Team→編輯衝突...→出現以下界面
以對比的方式將本地內容與衝突內容顯示出來,其中左側爲本地內容,右側爲衝突內容。其中本地內容是能夠修改的。
(2)根據須要和實際狀況將本地內容更正——這個過程極可能須要牽涉衝突的兩位開發人員進行必要的溝通——機器與程序目前還不能徹底取代人工智能。更正後文件圖標會變成一個「四角形」,同時衝突文件內的<<<<<<< .mine、=======以及>>>>>>> .r14等標記都會被去掉。
(3)在衝突文件上點右鍵→Team→標記爲解決
此時.mine文件和.r版本號文件都會被自動刪除,衝突文件的圖標變爲「*」,表示能夠提交。
(4)提交文件,文件圖標變爲「金色圓柱體」。
10 使用SVN獨立客戶端:TortoiseSVN
10.1 TortoiseSVN簡介
TortoiseSVN是一個Windows下的版本控制系統Apache™ Subversion®的客戶端工具。
10.2 TortoiseSVN的優良特性
①外殼集成
TortoiseSVN 無縫地整合進 Windows 的外殼(例如資源管理器)。
②重載圖標
每一個版本控制的文件和目錄的狀態使用小的重載圖標表示,可讓你馬上看出工做副本的狀態。
③圖形用戶界面
當你列出文件或文件夾的更改時,你能夠點擊任意版本查看提交註釋。也能夠看到更改過的文件列表 - 只要雙擊文件就能夠查看更改內容。
提交對話框列出了本次提交將要包括的條目,每個條目有一個複選框,因此你能夠選擇包括哪些條目。未版本控制的文件也會被列出,以防你忘記添加新文件。
④Subversion 命令的簡便訪問
全部的 Subversion 命令存在於資源管理器的右鍵菜單,TortoiseSVN 在那裏添加子菜單。
10.3 TortoiseSVN 的歷史
2002年,Tim Kemp 發現 Subversion 是一個很是好的版本管理系統,可是缺少一個好的圖形界面客戶端程序。作一個與 Windows 外殼整合的 Subversion 客戶端程序的想法是受一個叫 TortoiseCVS 的 CVS客戶端程序所啓發的。Tim 研究了 TortoiseCVS 的源碼並以此爲 TortoiseSVN 的基礎。他開始運做這個項目,註冊了域名 tortoisesvn.org 而且將源碼放在了網上。
就在同時, Stefan Küng 正在尋找一個好用的而且免費的版本控制系統。他找到了 Subversion 和TortoiseSVN 的源碼。由於 TortoiseSVN 還不能使用,他加入了項目並開始編碼。很快,他就重寫了現有的大部分代碼並開始添加命令和功能,到了某個時段,最初的代碼已經都被改寫了。
因爲 Subversion 變得愈來愈穩定,它吸引了愈來愈多用戶,他們同時也開始使用 TortoiseSVN 做爲Subversion 的客戶端程序。用戶數量快速增加(而且天天還在增加)。這時候,Lübbe Onken 提出幫助項目提供精美的圖標和 TortoiseSVN 的標誌。如今他負責照看網站和管理多語言翻譯。
10.4 TortoiseSVN安裝
①下載安裝程序:http://tortoisesvn.net/downloads.html
Win32位:TortoiseSVN-1.8.7.25475-win32-svn-1.8.9.msi
Win64位:TortoiseSVN-1.8.7.25475-x64-svn-1.8.9.msi
Win32位語言包:LanguagePack_1.8.7.25475-win32-zh_CN.msi
Win64位語言包:LanguagePack_1.8.7.25475-x64-zh_CN.msi
②以Win32位爲例
10.5 中文語言包安裝
在任意目錄下點右鍵→TortoiseSVN→settings
10.6 檢出
①建立一個目錄用來存放檢出獲得的文件,例如MyCRM
②進入目錄MyCRM,點右鍵
③能夠看到檢出獲得的文件
此時文件圖標上沒有任何標識。可能你會想到經過重啓電腦的方式解決這一問題——其實不用這麼麻煩。文件圖標是受外殼程序控制的,咱們只須要重啓外殼程序——explorer.exe就能夠了。打開任務管理器,選中explorer.exe進程,結束進程,而後新建進程explorer.exe就能夠了。
若是一切順利的話,你會看到文件圖標變成了這樣:
④TortoiseSVN圖標含義
●圖標1:一個新檢出的工做副本使用綠色的對勾作重載。表示Subversion狀態正常。
●圖標2:在你開始編輯一個文件後,狀態就變成了已修改,而圖標重載變成了紅色感嘆號。經過這種方式,你能夠很容易地看出哪些文件從你上次更新工做副本後被修改過,須要被提交。
●圖標3:若是在更新的過程當中出現了衝突,圖標會變成黃色感嘆號。
●圖標4:若是你給一個文件設置了svn:needs-lock屬性,Subversion會讓此文件只讀,直到你得到文件鎖。具備這個重載圖標的文件來表示你必須在編輯以前先獲得鎖。
●圖標5:若是你擁有了一個文件的鎖,而且Subversion狀態是正常,這個重載圖標就提醒你若是不使用該文件的話應該釋放鎖,容許別人提交對該文件的修改。
●圖標6:這個圖標表示當前文件夾下的某些文件或文件夾已經被調度從版本控制中刪除,或是該文件夾下某個受版本控制的文件丟失了。
●圖標7:加號告訴你有一個文件或目錄已經被調度加入版本控制。
●圖標8:橫條告訴你有一個文件或目錄被版本控制系統所忽略。這個圖標重載是可選的。
●圖標9:這個圖標說明文件和目錄未被版本控制,可是也沒有被忽略。這個圖標重載是可選的。
10.7 歸入版本控制
①新建文件abc.txt
②在文件上點右鍵
③添加後文件圖標發生變化
10.8 提交
①使用TortoiseSVN能夠提交具體某一個文件,或某一個目錄下的全部改變。方法就是在想要提交的項目下點右鍵,而後SVN Commit...,就能夠看到以下界面
②日誌內容若是不填,TortoiseSVN會提交一個空字符串做爲日誌信息。
③提交後顯示信息以下
④沒有歸入版本控制的文件默認是不在提交範圍內的,直接在新建立的文件上點右鍵只能看到add操做的選項,如前所述。但在新建立的文件所在目錄點右鍵選擇SVN commit...,能夠看到以下界面
將文件newFile.txt選中
一樣能夠提交文件,TortoiseSVN會幫咱們自動將newFile.txt歸入版本控制
10.9 更新
在要更新的文件或目錄上點右鍵→SVN Update
10.10 回覆歷史版本
①查看歷史版本內容
[1]首先須要把對應版本庫的匿名訪問權限設置爲none:anon-access = none
[2]在要查看歷史版本的文件上點右鍵→TortoiseSVN→Show log
[3]在感興趣的歷史版本上點右鍵,能夠與當前工做副本進行比較,或直接打開。
②在要回復歷史版本的文件上點右鍵→Update to revision
填上想要回到的版本便可
10.11 解決衝突
①文件發生衝突時的狀態和在Eclipse中同樣,這裏就不贅述了。
②在衝突的文件上點右鍵→Edit Conflicts
③有「歎號」的行是發生衝突的行
④在衝突行點右鍵
能夠選擇四種操做:
[1]使用個人
[2]使用他們的
[3]把個人放在他們的前面
[4]把他們的放在個人前面
⑤在衝突解決後,直接保存——這時TortoiseSVN自動彈出以下確認界面
⑥文件變爲紅色歎號標誌,自動生成的三個文件被刪除。提交修改便可。