3個問題
- 安裝優化軟件環境nginx,lvs <== 運維工程師
- 程序代碼(不斷更新)<==開發工程師,開發+運維
- 配置變更(不斷變更)<==運維工程師
SVN介紹
SVN是Subversion的簡稱,是一個開放源代碼的版本控制系統,主要用來管理代碼的,就跟
文件服務器和ftp服務器一樣,但是,它能監控文件的修改并記錄每次的變化,必要時可以還原
到之前的某一個修改,采用集中式的代碼管理。
開始新一天的工作:
0 、在中央庫上創建或從主干上復制一個分支
1、從服務器下載項目組最新代碼(check out)。
2、進入自己的分支,進行工作,每隔一個小時向服務器自己的分支提交一次代碼(很多人都有這個習慣。因為有時候自己對代碼改來改去,最后又想還原到前一個小時的版本,或者看看前一個小時自己修改了哪些代碼,就需要這樣做了)。
3、下班時間快到了,把自己的分支合并到服務器主分支上,一天的工作完成,并反映給服務器。
這就是經典的svn工作流程。
缺點:和中央庫的話交互需要網絡(一般局域網不用擔心),數據版本記錄需要備份
SVN和git的區別
svn是一個集中式的版本控制系統。
git是一個分布式的版本控制系統,本地有一個和遠程一樣的庫(這2個庫邏輯上是等價的),支持離線開發,而且git也可以做這種集中式的版本控制,只是操作上可能沒有svn快捷而已,每次提交時都讓本地庫和遠程庫進行同步的話就是集中式的版本控制。
SVN的運行模式以及訪問方式
服務器端訪問主要3種:
1. 單獨的服務器訪問
2. 借助apach的Http訪問
3. 本地直接訪問
本人用的是VirtualSVN,下載地址:
https://www.visualsvn.com/server/download/
客戶端訪問方式:一般是通過安裝客戶端軟件
下載地址:https://tortoisesvn.net/downloads.html
SVN檔案庫數據格式(類似文件系統):
BDB(事務安全型表類型)
FSFS(一種不需要數據庫的存儲系統)
VDFS ( 多倉庫分布式的文件存儲系統)
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.
簡單來說這個是VisualSVN基于FSFS文件系統格式擴展的。也就是說,分布式版本管理DVCS興起之后,大家發現多個倉庫的好處了,開始給SVN增加這個功能。至于FSFS本身是SVN在2004年開始替換Berkeley DB的,是基于文件系統概念設計的,而不是基于數據庫的概念,采用目錄樹的結構去做transaction,可以在目錄外創建完一次提交,然后把完成的提交一次性移動進版本歷史。另外,根據他們的數據結構,對Berkeley DB的append操作是O(N^2)的,而FSFS是O(N)的。如果你不是太在乎私有格式,也需要多倉庫同步,可以用VDFS,官方文檔說了VDFS默認的service是沒有啟動的,所以對你日常應該沒有影響。如果不喜歡私有格式,就用FSFS就好。
SVN服務端
SVN服務端的配置有多種方案:可以安裝Svnserve服務,也可以安裝Apache服務,但最簡單的莫過于使用VisualSVN Server這種方式.(https://www.visualsvn.com/server/download/)
-
開始安裝點next
圖片.png -
同意一下協議
圖片.png -
選擇服務器版和管理源工具
圖片.png -
這里選標準版的,專業版要密鑰的,但是標準版好像不支持分布式版本倉庫)
圖片.png -
自定義安裝目錄以及倉庫位置
圖片.png
版本庫:
版本庫
就是存放文件、代碼及版本信息的地方。服務器針對某一項目創建版本庫后,客戶端才能訪問該項目的文件、代碼。因此在服務器上創建、刪除版本庫是十分重要的工作。
-
點“next”開始正式安裝,之后啟動可以看到如下界面
圖片.png
服務器端的使用
-
啟動服務器端:安裝成功后點windows的“開始”會看到如下圖標,點進去就是。
圖片.png圖片.png 創建版本庫
a. 這里提供了2種格式的倉庫,一種是普通的FSFS,一種是VDFS(這個格式的目前只有專業版支持)進入管理界面,選中Repositories
,右鍵create New repositorie...
b. 創建輸入倉庫名稱后
c. 提示選擇Repository Structs,選擇
single-project repository
d. 然后會提示配置倉庫權限,這里選擇customize permissions
自定義我們的權限,
e. 最后點擊finish
完成創建。
- 刪除版本庫
選中需要刪除的倉庫,右鍵刪除就是。注意:刪除版本庫是無法撤銷的,請謹慎處理
。 - 用戶管理
a. 創建用戶
選中Users
,右鍵選擇create User ...
,按要求輸入用戶名和密碼便可。
b. 編輯用戶
選中用戶,右鍵便會看到對應的功能按鈕。
例如:修改用戶密碼
組管理
組管理和用戶管理一樣的,這里就不贅述了。權限管理
a. 權限一般是作為倉庫的一部分功能處理的,所以,當你想給一個用戶或者一個組分配權限的時候,你需要直接右鍵選中你需要分配去權限的倉庫,然后選中properties..
單擊出現如下面板,有什么想配置的權限直接使用面板就是。點擊Add
可以便可以進行權限配置。
b. 自己選擇是給所有人分配,還是某個組還是某個用戶,分配完成后點應用便可。
SVN客戶端的使用
SVN客戶端為TortoiseSVN,安裝之后就可以訪問服務器端的版本庫。讀取項目文件、代碼,還可以將修改后的文件、代碼上傳到服務器上,與項目組成員共同維護項目文件、代碼。
-
3.1 安裝TortoiseSVN
下載地址:https://tortoisesvn.net/downloads.html
自己根據需要選擇下載的版本
運行安裝程序,如:TortoiseSVN-1.9.7.27907-x64-svn-1.9.7.msi。其安裝步驟比較簡單,自己直接安裝。 安裝成功的話在桌面上右鍵會出現如下界面
3.2 Import(導入)
導入、導出是以服務器上的版本庫為中心的。導入就是將項目文檔寫入版本庫。Windows資源管理器中,鼠標右鍵單擊要導入的文件夾。在彈出菜單中,單擊【TortoiseSVN】下的【Import...】菜單項。-
3.2.1. 首先選中你需要導入的項目文件夾,右鍵按如下操作點擊便可。
-
3.2.2. 進入導入界面,書寫導入日志。
3.2.3. 進入SVN認證界面。輸入用戶名和密碼后,單擊"OK"按鈕完成認證。注意用戶名和密碼都是區分大小寫的。如果覺得每次都要輸入用戶名和密碼比較繁瑣,請勾中"Save authentication"復選框。下次SVN會自動完成認證。
SVN完成認證后,會將選定的文件夾內容導入到版本庫中。
需要說明的是
1、一般只是在項目開始的時候才會用到導入功能;
2、如果待導入的文件或文件夾在版本庫內已經存在,則導入會失敗。也就是說不能重復導入;
3、目錄問題。一次只能導入一個文件夾。假如導入的文件夾為Folder。導入到版本庫時不會有Folder這個文件夾;-
3.3.4 導入成功后會看到如下界面
3.3 Export(導出)
導出就是將項目文檔從版本庫中提取出來。Windows資源管理器中,單擊鼠標右鍵。在彈出菜單中,單擊【TortoiseSVN】下的【Export...】菜單項。SVN顯示如下。
在URL of repository下輸入版本庫的地址。在Export directory下輸入本機存放目錄。導出深度有四個選項,分別為:
Fully recursive(深度遞歸):導出指定目錄下的文件、各級子目錄以及各級子目錄下的文件。也就是全部導出。默認就是選擇該項;
Immediate children, including folders(直接子節點,包含文件夾):導出指定目錄下的文件和一級子目錄,但不導出一級子目錄內的文件;
Only file children(僅文件子節點):只導出指定目錄下的文件,不導出一級子目錄及一級子目錄內的文件。
Only this item(僅此項):只導出指定目錄。導出后就是一個空目錄,沒有什么實際意義。
Revision是版本的意思。項目組里任何一人修改了文檔,上傳到服務器上后都會形成一個新的版本,也就會有一個新的版本號。HEAD revision 表示最新的版本,也可以輸入指定的版本號。
配置好后,單擊"OK"按鈕。
因為要和服務器通訊,因此與導入一樣,可能需要進行用戶認證(我這里的版本不需要)。
-
3.4 Checkout(檢出)
Windows資源管理器中,單擊鼠標右鍵。在彈出菜單中,單擊【SVN Checkout...】菜單項。剩下的步驟與導出大致相同。
- 3.4.1 導出和檢出的區別
既然有導出功能了,還要檢出做什么呢?因為與導出不同,檢出的文檔有兩份。一份是用戶能看到、修改的文檔,被稱之為Working Copy,以下簡稱Copy版;另一份是被隱藏在.SVN文件夾下的文檔,被稱之為Working BASE,以下簡稱BASE版。假如有Copy版的文件1.txt,則其對應的BASE版文件為.svn\text-base\1.txt.svn-base。1.txt有兩份,被稱之為versioned文件。如果用戶將2.txt復制到檢出目錄,則2.txt只有一份,被稱之為non-versioned文件。
當用戶修改了Copy版的文檔,上傳到服務器版本庫的時候。SVN會比較Copy版和BASE版有什么不同之處,然后只將用戶的修改信息上傳至服務器。
當用戶修改了Copy版的文檔,該文檔的圖標會被改變。這也是SVN比較Copy版和BASE版的結果。
versioned文件有兩個版本,因此對它的刪除、重命名、移動必須通過SVN來完成,下面幾節將介紹這些操作。 - 3.5 刪除文件
資源管理器中,鼠標右鍵單擊待刪除的文件,單擊彈出菜單的【TortoiseSVN】點擊
【Repo-Browser】瀏覽倉庫,選擇文件右鍵點擊【Delete】菜單項即可完成刪除操作。
- 3.6 重命名文件
同刪除文件差不多的操作,只是最后選擇的時【Rename】而已。 - 3.7 增加文件
檢出目錄里的non-versioned文件可以增加至BASE,變成versioned文件。
資源管理器中,選中若干項文件或文件夾。鼠標右鍵單擊某一選中項。單擊彈出菜單的【TortoiseSVN】【Add...】菜單項。SVN顯示如下界面。單擊"OK"按鈕即可完成增加操作。
需要注意的是這個增加只是增加到本機的BASE,而不是直接增加到服務器的版本庫中
- 3.8 移動文件
資源管理器中,選中若干項文件或文件夾。移動鼠標至某一選中項,按下鼠標右鍵不放,移動鼠標至目標文件夾再放開鼠標右鍵。 - 3.9 Commit(提交)
當用戶對檢出的文檔做了修改后,需要將修改信息上傳到服務器的版本庫里,以便項目組的其它成員共享。這個上傳的過程就是提交。
Windows資源管理器中,鼠標右鍵單擊要提交的文件夾。在彈出菜單中,單擊【SVN Commit...】菜單項。SVN顯示如下界面:
message中寫入你對項目文檔都做了哪些修改。一定要養成填寫該項的好習慣,方便項目組其他成員清楚項目都發生了哪些變化。
Changes made下的列表列出了哪些文件被改變了。改變的文件分為兩大類:一類是在Copy版中存在,但在BASE版中不存在的文件,即non-versioned文件;另一類是在BASE版中存在的文件,即versioned文件,其Text status有可能是modified(修改)、added(增加)、deleted(刪除)……
列表中勾中要提交的文件,單擊"OK"按鈕即可完成提交操作。提交過程中可能會產生沖突,其解決方法請參考"沖突"這一節。
- 3.9.1 non-versioned文件
對于non-versioned文件,SVN默認不提交至服務器。下次提交的時候,如果希望某個non-versioned文件不再出現在列表中,其方法就是忽略。
提交界面(圖3.11)中,鼠標右鍵單擊一個non-versioned文件夾,彈出菜單中有【Add to ignore list】。它有兩個選項,一個是文件夾本身,另一個是。前者表示忽略該文件夾,下次提交時該文件夾將不再顯示在列表里。后者表示忽略所有non-versioned文件,下次提交時所有的non-versioned文件將不再顯示在列表里。顯然忽略是應該謹慎使用的。
提交界面(圖3.11)中,鼠標右鍵單擊一個non-versioned文件,彈出菜單中有【Add to ignore list】。以下圖為例,它有兩個選項,一個是文件本身,另一個是*.pch。前者表示忽略該文件,下次提交時該文件將不再顯示在列表里。后者表示忽略所有擴展名為pch的non-versioned文件,下次提交時這些文件將不再顯示在列表里。應該謹慎使用后者。
-
3.9.2 versioned文件
對于versioned文件,SVN默認將其提交至服務器。如果下次提交的時候,不希望提交某個versioned文件,其方法就是將其移動到提交忽略列表。
提交界面(圖3.11)中,鼠標右鍵單擊一個versioned文件,單擊彈出菜單中的【Move to changelist】【ignore-on-commit】菜單項即可將該文件移動到提交忽略列表。
3.10 Update(更新)
一個軟件項目組有多個成員。成員A修改代碼并提交之后,成員B如何獲得最新版本?方法就是成員B需要更新本地代碼。
Windows資源管理器中,鼠標右鍵單擊檢出的項目目錄。在彈出菜單中,單擊【SVN Update】菜單項。因為要和服務器通訊,因此需要進行用戶認證。認證界面如圖3.3所示。完成認證后,SVN將更新本地文件為最新版本。
注意:更新過程中可能會產生沖突,其解決方法請參考"沖突"這一節。3.11 沖突
多人維護一套代碼,以下情況是難免的:
1、程序員A和程序員B都修改了文件test.txt,然后都向版本庫提交。版本庫不知道以哪個版本為準,這會產生文件沖突;
2、程序員A修改了文件test.txt,向版本庫提交時發現文件test.txt已經被程序員B刪除了或重命名了或移動到別的目錄了,這會產生樹沖突。-
3.11.1 文件沖突
文件沖突比較簡單,就是多個成員對同一文件進行了修改,版本庫不知道該以哪個版本為準。對于文件沖突,這里分兩種情況說明。- 3.11.1.1 文本文件
假定項目里有文件1.txt,其內容如下:
- 3.11.1.1 文本文件
項目成員A負責維護開發組成員名單,項目成員B負責測試組成員名單。
現在A修改test.txt文件內容并提交:
項目成員B修改test.txt如下:
當項目成員B提交的時候,就會出錯。其出錯界面如下:
上圖說明test.txt已經被人修改,需要先更新。成員B按提示要求Update了本機代碼,其界面如下。
雙擊沖突,手動解決沖突。
請注意Merged這個單詞,它表示SVN將版本庫最新版本的1.txt和B修改的1.txt合并了。合并的結果如下,其內容正是A、B期望得到的結果。注意這個最新的文件只保留在B的本機上,需要B提交后版本庫里的test.txt才能得到更新。
也就是說,對于文本文件,SVN有合并能力。它能將項目組成員的改動集中起來,減少了文件沖突的發生。但是SVN的合并不是萬能的。假如B對1.txt做了非常大的改動,Update的時候將無法合并。
- 3.11.1.2 二進制文件
一個項目里的文件并不都是文本文件,如:Word文檔,bmp位圖……遇到這類文件,SVN很難通過比較差異來替項目組成員解決沖突了。此時,最有效的方法是使用鎖。
假定項目組成員A要編輯位圖1.bmp,正確的操作步驟為:
1、請在資源管理器中右鍵單擊該文件,單擊彈出菜單里的【TortoiseSVN】【Get lock...】菜單項,SVN顯示如下。請輸入鎖定該文件的原因,然后單擊"OK"按鈕完成文件鎖定;
2、如果A未對1.bmp做任何修改,暫時又不想編輯它,請盡快解鎖。方法為右鍵單擊該文件,單擊彈出菜單里的【TortoiseSVN】【Release lock】菜單項;
3、如果A對1.bmp做了修改并確認無誤后,請盡快提交它。方法為右鍵單擊該文件,單擊彈出菜單里的【SVN Commit...】菜單項。提交之后,SVN自動解鎖該文件。
項目組成員B要編輯1.bmp同樣遵循該步驟。因為一個文件不能同時被兩個用戶鎖定,這樣就保證了1.bmp不會發生沖突。
- 3.11.2 樹沖突
發生樹沖突的情況比較多,解決起來也比較復雜,應盡量避免。項目組成員需要遵循以下幾個原則:
1、除非必要,否則不要刪除、移動、重命名文件;
2、刪除、移動、重命名文件提交時,一定要詳細寫明刪除、移動、重命名了哪些文件,以及為什么這樣做。這樣其他項目組成員在Update的時候,可以根據這個說明照做一遍,解決樹沖突。 -
3.12 Properties(屬性)
前文提到了提交non-versioned文件時,可以忽略的操作。那么忽略的信息存放在哪兒了呢?答案就是文件夾屬性。
鼠標右鍵單擊檢出代碼的文件夾,單擊彈出菜單的【TortoiseSVN】【Properties】菜單項。SVN顯示如下。這里文件夾有一個很有趣的屬性svn:ignore,它的值為*.pch,其含義為:提交時將忽略所有擴展名為pch的non-versioned文件。如果你想去除這個功能,就把這條屬性編輯一下,或者直接刪除即可。
分支的創建,刪除,合并,切換
1.創建分支
右擊已經存在的SVN項目->branch/tag,彈出框的to path輸入新的分支名稱,建議/branch/xxx,點擊OK就創建出xxx分支.(建議創建前先svn update)
2.切換分支
右擊已經存在的SVN項目->switch,彈出框的to path輸入分支名稱,上面新建了/branch/xxx分支,如果想要切換/branch/xxx分支,則輸入/branch/xxx點擊OK.
3.合并分支
右擊已經存在的SVN項目->merge->merge a range of revisions->URL to merge from選擇需要合并的代碼分支,specific range輸入框選擇show log選擇需要合并的版本號區間,然后一路next完成合并,如果有沖突解決完代碼沖突,需要svn commit才能完成合并.
4.刪除分支
右擊已經存在的SVN項目->repo browser,彈出框的左邊選擇需要刪除的分支右擊->delete*