3個(gè)問題
- 安裝優(yōu)化軟件環(huán)境nginx,lvs <== 運(yùn)維工程師
- 程序代碼(不斷更新)<==開發(fā)工程師,開發(fā)+運(yùn)維
- 配置變更(不斷變更)<==運(yùn)維工程師
SVN介紹
SVN是Subversion的簡(jiǎn)稱,是一個(gè)開放源代碼的版本控制系統(tǒng),主要用來管理代碼的,就跟
文件服務(wù)器和ftp服務(wù)器一樣,但是,它能監(jiān)控文件的修改并記錄每次的變化,必要時(shí)可以還原
到之前的某一個(gè)修改,采用集中式的代碼管理。
開始新一天的工作:

0 、在中央庫上創(chuàng)建或從主干上復(fù)制一個(gè)分支
1、從服務(wù)器下載項(xiàng)目組最新代碼(check out)。
2、進(jìn)入自己的分支,進(jìn)行工作,每隔一個(gè)小時(shí)向服務(wù)器自己的分支提交一次代碼(很多人都有這個(gè)習(xí)慣。因?yàn)橛袝r(shí)候自己對(duì)代碼改來改去,最后又想還原到前一個(gè)小時(shí)的版本,或者看看前一個(gè)小時(shí)自己修改了哪些代碼,就需要這樣做了)。
3、下班時(shí)間快到了,把自己的分支合并到服務(wù)器主分支上,一天的工作完成,并反映給服務(wù)器。
這就是經(jīng)典的svn工作流程。
缺點(diǎn):和中央庫的話交互需要網(wǎng)絡(luò)(一般局域網(wǎng)不用擔(dān)心),數(shù)據(jù)版本記錄需要備份
SVN和git的區(qū)別
svn是一個(gè)集中式的版本控制系統(tǒng)。
git是一個(gè)分布式的版本控制系統(tǒng),本地有一個(gè)和遠(yuǎn)程一樣的庫(這2個(gè)庫邏輯上是等價(jià)的),支持離線開發(fā),而且git也可以做這種集中式的版本控制,只是操作上可能沒有svn快捷而已,每次提交時(shí)都讓本地庫和遠(yuǎn)程庫進(jìn)行同步的話就是集中式的版本控制。
SVN的運(yùn)行模式以及訪問方式
服務(wù)器端訪問主要3種:
1. 單獨(dú)的服務(wù)器訪問
2. 借助apach的Http訪問
3. 本地直接訪問
本人用的是VirtualSVN,下載地址:
https://www.visualsvn.com/server/download/
客戶端訪問方式:一般是通過安裝客戶端軟件
下載地址:https://tortoisesvn.net/downloads.html
SVN檔案庫數(shù)據(jù)格式(類似文件系統(tǒng)):
BDB(事務(wù)安全型表類型)
FSFS(一種不需要數(shù)據(jù)庫的存儲(chǔ)系統(tǒng))
VDFS ( 多倉庫分布式的文件存儲(chǔ)系統(tǒng))
Replication links between a master repository and its slaves are maintained by a service named VisualSVN Distributed File System Service (also referred to as 'VDFS service') running on all the partner servers.
The VDFS service is disabled by default. You are required to enable this service on all the replication partners to get started with the repository replication functionality.
簡(jiǎn)單來說這個(gè)是VisualSVN基于FSFS文件系統(tǒng)格式擴(kuò)展的。也就是說,分布式版本管理DVCS興起之后,大家發(fā)現(xiàn)多個(gè)倉庫的好處了,開始給SVN增加這個(gè)功能。至于FSFS本身是SVN在2004年開始替換Berkeley DB的,是基于文件系統(tǒng)概念設(shè)計(jì)的,而不是基于數(shù)據(jù)庫的概念,采用目錄樹的結(jié)構(gòu)去做transaction,可以在目錄外創(chuàng)建完一次提交,然后把完成的提交一次性移動(dòng)進(jìn)版本歷史。另外,根據(jù)他們的數(shù)據(jù)結(jié)構(gòu),對(duì)Berkeley DB的append操作是O(N^2)的,而FSFS是O(N)的。如果你不是太在乎私有格式,也需要多倉庫同步,可以用VDFS,官方文檔說了VDFS默認(rèn)的service是沒有啟動(dòng)的,所以對(duì)你日常應(yīng)該沒有影響。如果不喜歡私有格式,就用FSFS就好。
SVN服務(wù)端
SVN服務(wù)端的配置有多種方案:可以安裝Svnserve服務(wù),也可以安裝Apache服務(wù),但最簡(jiǎn)單的莫過于使用VisualSVN Server這種方式.(https://www.visualsvn.com/server/download/)
-
開始安裝點(diǎn)next
圖片.png -
同意一下協(xié)議
圖片.png -
選擇服務(wù)器版和管理源工具
圖片.png -
這里選標(biāo)準(zhǔn)版的,專業(yè)版要密鑰的,但是標(biāo)準(zhǔn)版好像不支持分布式版本倉庫)
圖片.png -
自定義安裝目錄以及倉庫位置
圖片.png
版本庫:
版本庫就是存放文件、代碼及版本信息的地方。服務(wù)器針對(duì)某一項(xiàng)目創(chuàng)建版本庫后,客戶端才能訪問該項(xiàng)目的文件、代碼。因此在服務(wù)器上創(chuàng)建、刪除版本庫是十分重要的工作。
-
點(diǎn)“next”開始正式安裝,之后啟動(dòng)可以看到如下界面
圖片.png
服務(wù)器端的使用
-
啟動(dòng)服務(wù)器端:安裝成功后點(diǎn)windows的“開始”會(huì)看到如下圖標(biāo),點(diǎn)進(jìn)去就是。
圖片.png圖片.png 創(chuàng)建版本庫
a. 這里提供了2種格式的倉庫,一種是普通的FSFS,一種是VDFS(這個(gè)格式的目前只有專業(yè)版支持)進(jìn)入管理界面,選中Repositories,右鍵create New repositorie...


b. 創(chuàng)建輸入倉庫名稱后

c. 提示選擇Repository Structs,選擇
single-project repository

d. 然后會(huì)提示配置倉庫權(quán)限,這里選擇customize permissions自定義我們的權(quán)限,

e. 最后點(diǎn)擊finish完成創(chuàng)建。
- 刪除版本庫
選中需要?jiǎng)h除的倉庫,右鍵刪除就是。注意:刪除版本庫是無法撤銷的,請(qǐng)謹(jǐn)慎處理。 - 用戶管理
a. 創(chuàng)建用戶
選中Users,右鍵選擇create User ...,按要求輸入用戶名和密碼便可。
b. 編輯用戶
選中用戶,右鍵便會(huì)看到對(duì)應(yīng)的功能按鈕。

例如:修改用戶密碼

組管理
組管理和用戶管理一樣的,這里就不贅述了。權(quán)限管理
a. 權(quán)限一般是作為倉庫的一部分功能處理的,所以,當(dāng)你想給一個(gè)用戶或者一個(gè)組分配權(quán)限的時(shí)候,你需要直接右鍵選中你需要分配去權(quán)限的倉庫,然后選中properties..單擊出現(xiàn)如下面板,有什么想配置的權(quán)限直接使用面板就是。點(diǎn)擊Add可以便可以進(jìn)行權(quán)限配置。



b. 自己選擇是給所有人分配,還是某個(gè)組還是某個(gè)用戶,分配完成后點(diǎn)應(yīng)用便可。


SVN客戶端的使用
SVN客戶端為TortoiseSVN,安裝之后就可以訪問服務(wù)器端的版本庫。讀取項(xiàng)目文件、代碼,還可以將修改后的文件、代碼上傳到服務(wù)器上,與項(xiàng)目組成員共同維護(hù)項(xiàng)目文件、代碼。
-
3.1 安裝TortoiseSVN
下載地址:https://tortoisesvn.net/downloads.html
自己根據(jù)需要選擇下載的版本
運(yùn)行安裝程序,如:TortoiseSVN-1.9.7.27907-x64-svn-1.9.7.msi。其安裝步驟比較簡(jiǎn)單,自己直接安裝。 安裝成功的話在桌面上右鍵會(huì)出現(xiàn)如下界面
3.2 Import(導(dǎo)入)
導(dǎo)入、導(dǎo)出是以服務(wù)器上的版本庫為中心的。導(dǎo)入就是將項(xiàng)目文檔寫入版本庫。Windows資源管理器中,鼠標(biāo)右鍵單擊要導(dǎo)入的文件夾。在彈出菜單中,單擊【TortoiseSVN】下的【Import...】菜單項(xiàng)。-
3.2.1. 首先選中你需要導(dǎo)入的項(xiàng)目文件夾,右鍵按如下操作點(diǎn)擊便可。
-
3.2.2. 進(jìn)入導(dǎo)入界面,書寫導(dǎo)入日志。
3.2.3. 進(jìn)入SVN認(rèn)證界面。輸入用戶名和密碼后,單擊"OK"按鈕完成認(rèn)證。注意用戶名和密碼都是區(qū)分大小寫的。如果覺得每次都要輸入用戶名和密碼比較繁瑣,請(qǐng)勾中"Save authentication"復(fù)選框。下次SVN會(huì)自動(dòng)完成認(rèn)證。
SVN完成認(rèn)證后,會(huì)將選定的文件夾內(nèi)容導(dǎo)入到版本庫中。
需要說明的是
1、一般只是在項(xiàng)目開始的時(shí)候才會(huì)用到導(dǎo)入功能;
2、如果待導(dǎo)入的文件或文件夾在版本庫內(nèi)已經(jīng)存在,則導(dǎo)入會(huì)失敗。也就是說不能重復(fù)導(dǎo)入;
3、目錄問題。一次只能導(dǎo)入一個(gè)文件夾。假如導(dǎo)入的文件夾為Folder。導(dǎo)入到版本庫時(shí)不會(huì)有Folder這個(gè)文件夾;-
3.3.4 導(dǎo)入成功后會(huì)看到如下界面
3.3 Export(導(dǎo)出)
導(dǎo)出就是將項(xiàng)目文檔從版本庫中提取出來。Windows資源管理器中,單擊鼠標(biāo)右鍵。在彈出菜單中,單擊【TortoiseSVN】下的【Export...】菜單項(xiàng)。SVN顯示如下。

在URL of repository下輸入版本庫的地址。在Export directory下輸入本機(jī)存放目錄。導(dǎo)出深度有四個(gè)選項(xiàng),分別為:
Fully recursive(深度遞歸):導(dǎo)出指定目錄下的文件、各級(jí)子目錄以及各級(jí)子目錄下的文件。也就是全部導(dǎo)出。默認(rèn)就是選擇該項(xiàng);
Immediate children, including folders(直接子節(jié)點(diǎn),包含文件夾):導(dǎo)出指定目錄下的文件和一級(jí)子目錄,但不導(dǎo)出一級(jí)子目錄內(nèi)的文件;
Only file children(僅文件子節(jié)點(diǎn)):只導(dǎo)出指定目錄下的文件,不導(dǎo)出一級(jí)子目錄及一級(jí)子目錄內(nèi)的文件。
Only this item(僅此項(xiàng)):只導(dǎo)出指定目錄。導(dǎo)出后就是一個(gè)空目錄,沒有什么實(shí)際意義。
Revision是版本的意思。項(xiàng)目組里任何一人修改了文檔,上傳到服務(wù)器上后都會(huì)形成一個(gè)新的版本,也就會(huì)有一個(gè)新的版本號(hào)。HEAD revision 表示最新的版本,也可以輸入指定的版本號(hào)。
配置好后,單擊"OK"按鈕。
因?yàn)橐头?wù)器通訊,因此與導(dǎo)入一樣,可能需要進(jìn)行用戶認(rèn)證(我這里的版本不需要)。
-
3.4 Checkout(檢出)
Windows資源管理器中,單擊鼠標(biāo)右鍵。在彈出菜單中,單擊【SVN Checkout...】菜單項(xiàng)。剩下的步驟與導(dǎo)出大致相同。
- 3.4.1 導(dǎo)出和檢出的區(qū)別
既然有導(dǎo)出功能了,還要檢出做什么呢?因?yàn)榕c導(dǎo)出不同,檢出的文檔有兩份。一份是用戶能看到、修改的文檔,被稱之為Working Copy,以下簡(jiǎn)稱Copy版;另一份是被隱藏在.SVN文件夾下的文檔,被稱之為Working BASE,以下簡(jiǎn)稱BASE版。假如有Copy版的文件1.txt,則其對(duì)應(yīng)的BASE版文件為.svn\text-base\1.txt.svn-base。1.txt有兩份,被稱之為versioned文件。如果用戶將2.txt復(fù)制到檢出目錄,則2.txt只有一份,被稱之為non-versioned文件。
當(dāng)用戶修改了Copy版的文檔,上傳到服務(wù)器版本庫的時(shí)候。SVN會(huì)比較Copy版和BASE版有什么不同之處,然后只將用戶的修改信息上傳至服務(wù)器。
當(dāng)用戶修改了Copy版的文檔,該文檔的圖標(biāo)會(huì)被改變。這也是SVN比較Copy版和BASE版的結(jié)果。
versioned文件有兩個(gè)版本,因此對(duì)它的刪除、重命名、移動(dòng)必須通過SVN來完成,下面幾節(jié)將介紹這些操作。 - 3.5 刪除文件
資源管理器中,鼠標(biāo)右鍵單擊待刪除的文件,單擊彈出菜單的【TortoiseSVN】點(diǎn)擊
【Repo-Browser】瀏覽倉庫,選擇文件右鍵點(diǎn)擊【Delete】菜單項(xiàng)即可完成刪除操作。


- 3.6 重命名文件
同刪除文件差不多的操作,只是最后選擇的時(shí)【Rename】而已。 - 3.7 增加文件
檢出目錄里的non-versioned文件可以增加至BASE,變成versioned文件。
資源管理器中,選中若干項(xiàng)文件或文件夾。鼠標(biāo)右鍵單擊某一選中項(xiàng)。單擊彈出菜單的【TortoiseSVN】【Add...】菜單項(xiàng)。SVN顯示如下界面。單擊"OK"按鈕即可完成增加操作。

需要注意的是這個(gè)增加只是增加到本機(jī)的BASE,而不是直接增加到服務(wù)器的版本庫中
- 3.8 移動(dòng)文件
資源管理器中,選中若干項(xiàng)文件或文件夾。移動(dòng)鼠標(biāo)至某一選中項(xiàng),按下鼠標(biāo)右鍵不放,移動(dòng)鼠標(biāo)至目標(biāo)文件夾再放開鼠標(biāo)右鍵。 - 3.9 Commit(提交)
當(dāng)用戶對(duì)檢出的文檔做了修改后,需要將修改信息上傳到服務(wù)器的版本庫里,以便項(xiàng)目組的其它成員共享。這個(gè)上傳的過程就是提交。
Windows資源管理器中,鼠標(biāo)右鍵單擊要提交的文件夾。在彈出菜單中,單擊【SVN Commit...】菜單項(xiàng)。SVN顯示如下界面:


message中寫入你對(duì)項(xiàng)目文檔都做了哪些修改。一定要養(yǎng)成填寫該項(xiàng)的好習(xí)慣,方便項(xiàng)目組其他成員清楚項(xiàng)目都發(fā)生了哪些變化。
Changes made下的列表列出了哪些文件被改變了。改變的文件分為兩大類:一類是在Copy版中存在,但在BASE版中不存在的文件,即non-versioned文件;另一類是在BASE版中存在的文件,即versioned文件,其Text status有可能是modified(修改)、added(增加)、deleted(刪除)……
列表中勾中要提交的文件,單擊"OK"按鈕即可完成提交操作。提交過程中可能會(huì)產(chǎn)生沖突,其解決方法請(qǐng)參考"沖突"這一節(jié)。
- 3.9.1 non-versioned文件
對(duì)于non-versioned文件,SVN默認(rèn)不提交至服務(wù)器。下次提交的時(shí)候,如果希望某個(gè)non-versioned文件不再出現(xiàn)在列表中,其方法就是忽略。
提交界面(圖3.11)中,鼠標(biāo)右鍵單擊一個(gè)non-versioned文件夾,彈出菜單中有【Add to ignore list】。它有兩個(gè)選項(xiàng),一個(gè)是文件夾本身,另一個(gè)是。前者表示忽略該文件夾,下次提交時(shí)該文件夾將不再顯示在列表里。后者表示忽略所有non-versioned文件,下次提交時(shí)所有的non-versioned文件將不再顯示在列表里。顯然忽略是應(yīng)該謹(jǐn)慎使用的。

提交界面(圖3.11)中,鼠標(biāo)右鍵單擊一個(gè)non-versioned文件,彈出菜單中有【Add to ignore list】。以下圖為例,它有兩個(gè)選項(xiàng),一個(gè)是文件本身,另一個(gè)是*.pch。前者表示忽略該文件,下次提交時(shí)該文件將不再顯示在列表里。后者表示忽略所有擴(kuò)展名為pch的non-versioned文件,下次提交時(shí)這些文件將不再顯示在列表里。應(yīng)該謹(jǐn)慎使用后者。
-
3.9.2 versioned文件
對(duì)于versioned文件,SVN默認(rèn)將其提交至服務(wù)器。如果下次提交的時(shí)候,不希望提交某個(gè)versioned文件,其方法就是將其移動(dòng)到提交忽略列表。
提交界面(圖3.11)中,鼠標(biāo)右鍵單擊一個(gè)versioned文件,單擊彈出菜單中的【Move to changelist】【ignore-on-commit】菜單項(xiàng)即可將該文件移動(dòng)到提交忽略列表。
3.10 Update(更新)
一個(gè)軟件項(xiàng)目組有多個(gè)成員。成員A修改代碼并提交之后,成員B如何獲得最新版本?方法就是成員B需要更新本地代碼。
Windows資源管理器中,鼠標(biāo)右鍵單擊檢出的項(xiàng)目目錄。在彈出菜單中,單擊【SVN Update】菜單項(xiàng)。因?yàn)橐头?wù)器通訊,因此需要進(jìn)行用戶認(rèn)證。認(rèn)證界面如圖3.3所示。完成認(rèn)證后,SVN將更新本地文件為最新版本。
注意:更新過程中可能會(huì)產(chǎn)生沖突,其解決方法請(qǐng)參考"沖突"這一節(jié)。3.11 沖突
多人維護(hù)一套代碼,以下情況是難免的:
1、程序員A和程序員B都修改了文件test.txt,然后都向版本庫提交。版本庫不知道以哪個(gè)版本為準(zhǔn),這會(huì)產(chǎn)生文件沖突;
2、程序員A修改了文件test.txt,向版本庫提交時(shí)發(fā)現(xiàn)文件test.txt已經(jīng)被程序員B刪除了或重命名了或移動(dòng)到別的目錄了,這會(huì)產(chǎn)生樹沖突。-
3.11.1 文件沖突
文件沖突比較簡(jiǎn)單,就是多個(gè)成員對(duì)同一文件進(jìn)行了修改,版本庫不知道該以哪個(gè)版本為準(zhǔn)。對(duì)于文件沖突,這里分兩種情況說明。- 3.11.1.1 文本文件
假定項(xiàng)目里有文件1.txt,其內(nèi)容如下:
- 3.11.1.1 文本文件

項(xiàng)目成員A負(fù)責(zé)維護(hù)開發(fā)組成員名單,項(xiàng)目成員B負(fù)責(zé)測(cè)試組成員名單。
現(xiàn)在A修改test.txt文件內(nèi)容并提交:


項(xiàng)目成員B修改test.txt如下:

當(dāng)項(xiàng)目成員B提交的時(shí)候,就會(huì)出錯(cuò)。其出錯(cuò)界面如下:

上圖說明test.txt已經(jīng)被人修改,需要先更新。成員B按提示要求Update了本機(jī)代碼,其界面如下。

雙擊沖突,手動(dòng)解決沖突。

請(qǐng)注意Merged這個(gè)單詞,它表示SVN將版本庫最新版本的1.txt和B修改的1.txt合并了。合并的結(jié)果如下,其內(nèi)容正是A、B期望得到的結(jié)果。注意這個(gè)最新的文件只保留在B的本機(jī)上,需要B提交后版本庫里的test.txt才能得到更新。

也就是說,對(duì)于文本文件,SVN有合并能力。它能將項(xiàng)目組成員的改動(dòng)集中起來,減少了文件沖突的發(fā)生。但是SVN的合并不是萬能的。假如B對(duì)1.txt做了非常大的改動(dòng),Update的時(shí)候?qū)o法合并。
- 3.11.1.2 二進(jìn)制文件
一個(gè)項(xiàng)目里的文件并不都是文本文件,如:Word文檔,bmp位圖……遇到這類文件,SVN很難通過比較差異來替項(xiàng)目組成員解決沖突了。此時(shí),最有效的方法是使用鎖。
假定項(xiàng)目組成員A要編輯位圖1.bmp,正確的操作步驟為:
1、請(qǐng)?jiān)谫Y源管理器中右鍵單擊該文件,單擊彈出菜單里的【TortoiseSVN】【Get lock...】菜單項(xiàng),SVN顯示如下。請(qǐng)輸入鎖定該文件的原因,然后單擊"OK"按鈕完成文件鎖定;



2、如果A未對(duì)1.bmp做任何修改,暫時(shí)又不想編輯它,請(qǐng)盡快解鎖。方法為右鍵單擊該文件,單擊彈出菜單里的【TortoiseSVN】【Release lock】菜單項(xiàng);
3、如果A對(duì)1.bmp做了修改并確認(rèn)無誤后,請(qǐng)盡快提交它。方法為右鍵單擊該文件,單擊彈出菜單里的【SVN Commit...】菜單項(xiàng)。提交之后,SVN自動(dòng)解鎖該文件。
項(xiàng)目組成員B要編輯1.bmp同樣遵循該步驟。因?yàn)橐粋€(gè)文件不能同時(shí)被兩個(gè)用戶鎖定,這樣就保證了1.bmp不會(huì)發(fā)生沖突。
- 3.11.2 樹沖突
發(fā)生樹沖突的情況比較多,解決起來也比較復(fù)雜,應(yīng)盡量避免。項(xiàng)目組成員需要遵循以下幾個(gè)原則:
1、除非必要,否則不要?jiǎng)h除、移動(dòng)、重命名文件;
2、刪除、移動(dòng)、重命名文件提交時(shí),一定要詳細(xì)寫明刪除、移動(dòng)、重命名了哪些文件,以及為什么這樣做。這樣其他項(xiàng)目組成員在Update的時(shí)候,可以根據(jù)這個(gè)說明照做一遍,解決樹沖突。 -
3.12 Properties(屬性)
前文提到了提交non-versioned文件時(shí),可以忽略的操作。那么忽略的信息存放在哪兒了呢?答案就是文件夾屬性。
鼠標(biāo)右鍵單擊檢出代碼的文件夾,單擊彈出菜單的【TortoiseSVN】【Properties】菜單項(xiàng)。SVN顯示如下。這里文件夾有一個(gè)很有趣的屬性svn:ignore,它的值為*.pch,其含義為:提交時(shí)將忽略所有擴(kuò)展名為pch的non-versioned文件。如果你想去除這個(gè)功能,就把這條屬性編輯一下,或者直接刪除即可。
分支的創(chuàng)建,刪除,合并,切換


1.創(chuàng)建分支
右擊已經(jīng)存在的SVN項(xiàng)目->branch/tag,彈出框的to path輸入新的分支名稱,建議/branch/xxx,點(diǎn)擊OK就創(chuàng)建出xxx分支.(建議創(chuàng)建前先svn update)
2.切換分支
右擊已經(jīng)存在的SVN項(xiàng)目->switch,彈出框的to path輸入分支名稱,上面新建了/branch/xxx分支,如果想要切換/branch/xxx分支,則輸入/branch/xxx點(diǎn)擊OK.
3.合并分支
右擊已經(jīng)存在的SVN項(xiàng)目->merge->merge a range of revisions->URL to merge from選擇需要合并的代碼分支,specific range輸入框選擇show log選擇需要合并的版本號(hào)區(qū)間,然后一路next完成合并,如果有沖突解決完代碼沖突,需要svn commit才能完成合并.
4.刪除分支
右擊已經(jīng)存在的SVN項(xiàng)目->repo browser,彈出框的左邊選擇需要?jiǎng)h除的分支右擊->delete*















