1. 程式人生 > >SVN版本控制學習

SVN版本控制學習

版本控制的作用

  • 讓版本庫中的任意一個檔案恢復到任意一個歷史版本
  • 追溯任意程式碼檔案的任意一行在什麼時間被什麼人修改過

常用版本控制

特性 CVS SVN GIT
併發修改 1 1 1
併發提交(0:每個檔案都有記錄版本號 1:批量檔案版本號) 0 1 1
歷史軌跡(0:不支援更名 1:支援更名) 0 1 1
分散式(0:集中式 1:分散式) 0 0 1

SVN

Linux系統下的SVN安裝

Ubuntu
apt-get install subversion
CentOS
yum install
subversion

服務端命令

svnserve - 控制svn系統服務的啟動等
svnadmin - 版本庫的建立/匯出/匯入/刪除等
svnlook    - 檢視版本庫的資訊等

客戶端命令

svn - 版本庫的檢出/更新/提交/重定向等

建立版本庫

svnadmin create /path/repos

刪除版本庫

rm -rvf /path/repos

版本庫配置及許可權分組

配置檔案位於 /path/repos/conf/
authz - 配置使用者組以及使用者組許可權
passwd - 配置使用者名稱和密碼
svnserve.conf - 配置預設許可權、許可權配置檔案及密碼配置檔案

執行版本庫

svnserve -d -r /path/repos

SVN版本庫訪問

svn checkout svn://192.168.0.130/ios --username xxx --password xxxx
svn co svn://192.168.0.130/ios --username xxx --password xxxx

checkout與export的區別和使用

checkout-檢出(檢出的工作副本中含有.svn資料夾)
export-匯出(檔案狀態:無版本控制)
svn checkout -r 2 //檢出版本2 (不加-r預設最新)
svn export -r 3 //匯出版本3     (不加-r預設最新)
.svn記錄著工作副本最後一次更新後的檔案狀態 .svn標記工作副本的一切變化

常見SVN客戶端命令
svn add - 新增到版本控制

svn add index.html (新增檔案)
svn add css  (新增目錄以及遞迴新增目錄下內容)
svn add css --non-recursive (只新增目錄)
svn add * --force(批量增加)
svn add * (批量增加,已經存在的目錄不會處理)

svn commit - 提交修改到服務端(建立一個新版本號)

svn ci -m “this is indexindex.html 
svn commit -m “this is indexindex.html 
svn commit -m “all” * 提交所有改動 

svn update - 更新工作副本

svn up (全目錄更新)
svn up -r 1 index.html (index.html更新到版本1狀態)
svn up * (所有檔案更新到最新版本)

svn delete - 從版本庫中刪除檔案或目錄

svn rm index.html -m “刪除index.html”
svn ci -m “刪除index.html”

svn diff - 版本差異比較

svn di index.html (比較工作副本與最後一次更新的差異)
svn di -r 2 index.html (比較工作副本與版本2的差異)
svn di -r 2:3 index.html (比較版本2與版本3的差異)
svn di (所有差異檔案)

svn mkdir - 建立目錄並增加到版本控制

svn mkdir doc 

svn cat - 不檢出工作副本直接檢視指定檔案

svn cat svm://192.168.0.130/index.html

工作副本還原

svn revert index.html
svn revert * (僅僅掃描當前目錄)
svn revert --recursive * (遞迴掃描所有目錄)

衝突

二進位制衝出與樹衝突
發生樹衝突的檔案都不是二進位制文字檔案
樹衝突無法精確到行並且處理樹衝突必須處理整個檔案

什麼是衝突以及衝突的產生條件
更新到的資料與工作副本的修改正好在同一處

如何儘可能的避免衝突
經常update

如何解決衝突
發現衝突優先選擇(p)推遲處理
確定處理方式後再解決衝突
svn resolve index.html (處理衝突)
svn resolved index.html (處理完衝突)
svn ci -m “” index.html

鎖定與解鎖

svn lock - 鎖定檔案,防止其他成員對檔案進行提交
svn lock index.html
svn ci -m “” --no-unlock index.html (防止預設提交自動解鎖)
svn unlock -解鎖檔案
svn unlock index.html

SVN進階應用
svn list - 列出當前目錄下處於版本控制的所有檔案

svn ls (不會列出無版本控制檔案,預設列出頂級目錄)
svn ls --recursive (遞迴列出所有版本控制檔案)
svn ls -v (詳細資訊)
svn ls -v --recursive

svn status -列出工作副本的檔案(夾)的狀態

svn st
?無版本控制
D 已被標記從版本庫中刪除
M 已被編輯過
A 已被標記增加到版本控制中
R 檔案被替換
C 檔案存在衝突
!檔案缺失

svn log - 檢視提交日誌 (來自svn ci 的 -m引數)

svn log
svn log index.html (檢視某個檔案相關)

svn info - 工作副本及檔案(夾)的詳細資訊

svn info
svn info index.html
svn info --xml (xml方式檢視)
svn info --xml >> info.xml(儲存xml檔案)
cat info.xml

svn merge - 合併分支

合併主幹上的最新程式碼到分支上
cd feature001
svn merge svn://192.168.0.130/ios/trunk
解決衝突、編譯、除錯、提交

分支合併到主幹
cd trunk
svn merge --reintegrate svn://192.168.0.130/ios/branches/feature001
編譯、驗證、提交 
svn ci -m “合併”

注意事項:
不管是從trunk合併到branch還是最終從branch合併回trunk,在每次合併前最好先update,然後將本地的修改先全部commit,保護好現場,萬一合併不理想隨時都可以revert合併完成後看是否能正確編譯,然後測試驗證,最後將合併後的改動提交到repository

多版本庫解決方案

A:埠號(版本庫可以建立在任意位置,埠號容易混淆)
TCP/IP協議規定埠號範圍為0-65535
0-1023 公認埠
1024-49151 註冊埠
49152-65535 私有埠
svnserve -d -r /path/repo --listen-port 3691 (開啟服務前需要配置)
killall svnserve (需要重新配置開啟服務)

B:路徑(多個版本庫必須要在同一目錄,無需分配埠號) 推薦使用
svnserve -d -r /svnroot/

svn copy

工作副本 -> 工作副本
svn cp index.html copy.html 
svn cp -r 4 index.html copyv4.html   (複製某個版本檔案)
svn cp index.html about.html ./temp (複製多個檔案到指定資料夾)

工作副本 -> 版本庫(不支援跨庫,提交不支援跨庫)
svn cp index.html svn://192.168.0.130/ios/target.html -m “提交複製檔案”
svn update

版本庫    -> 工作副本(允許跨庫)
svn cp svn://192.168.0.130/ios/target.html demo.html

版本庫    -> 版本庫(不可跨庫)

主幹版本與分支版本

svn cp svn://192.168.0.130/ios/ svn://192.168.0.130/ios/trunk -m “建立主幹分支”
svn cp svn://192.168.0.130/ios/trunk  svn://192.168.0.130/ios/branches/dev1.0.0 -m “建立dev1.0.0

SVN高階應用

HOOKS鉤子的應用
什麼是鉤子?
當執行某些特定操作時觸發執行預先設定好的任務

svn info svn://192.168.0.130/ios --xml >> /root/repo.xml
重啟生效
svn killall
svnserve -d -r /root

版本庫精簡與丟棄

killall svnserve
svnadmin dump /svnroot/ios/ -r 6:16 > -/ios.repo (備份版本庫6-16版本)
svnadmin create /svnroot/newios
svnadmin load /svnroot/newios/ < -/ios.repo  (載入後6-16 變成1-11)
配置檔案conf
svnserve -d -r /root
版本庫精簡後需要重新checkout,否則版本號不一致

版本庫遷移與switch重定向

killall svnserve
把 /svnroot/ios 壓縮成repo.zip
複製repo.zip到新伺服器並解壓
在新伺服器上執行repo版本庫
svn sw --relocate svn://192.168.0.130/ios svn://192.168.0.130/newios

SVN常見問題總結

忘記配置svnserve.conf
執行版本庫的路徑問題
svnadmin dump/load 管道符號問題