基本概念:
svn 是在一個服務器中建立以個源代碼庫,可以記錄每一個文件修改的記錄(每個源文件都有版本號),可以隨時回退到歷史版本。開發人員先要checkout代碼出來,可以在修改后再commmit上去。svn是屬于集中式版本控制系統,沒有網絡就不能co/ci了。
基本操作
update:
恢復到之前某個版本號:
不小心寫錯了很多東西,想撤銷所寫的東西(已經把修改提交到服務器
svn update -r 版本號
不小心刪錯了文件,想把文件恢復回來(已經把刪除提交到服務器)
svn update -r 版本號
checkout:
export = copy 一份,不會有倉庫、check out = 引用
1、Linux命令行下將文件checkout到本地目錄
svn checkout path(path是服務器上的目錄)//后面 空格 接需要checkout到的本地地址,如果沒有話,默認當時終端進入的地址
svn checkout svn://192.168.1.1/pro/domain
svn co http://xxx/svn/xxxx --username=manager --password=manager
有時整個 svn 目錄太過于龐大,不想整個 checkout 下來,但又想維持整個目錄結構以方便后續使用,那么可以使用 subversion 1.5 之后的 –depth 參數來只 checkout 需要的子目錄。
1、先checkout空目錄
svn co --depth empty svnLocation localDir
對需要的子目錄遞歸checkout
svn update --set-depth infinity localDir/data
svn update --set-depth infinity localDir/block
eg:按路徑checkout出來
svn co --depth empty http://svn.demo.pc.com.cn/svn/ios
svn update --set-depth emptyios/trunk
svn update --set-depth infinity ios/trunk/xxx
驗證是否可以,,進入相對的文件夾,使用
svn stutas -u 看是不是有對應的版本號就可以了
拿到的空目錄后,就可以正常checkout對應的路徑了。
move:
更改版本名稱:
svn move -m '*更改分支名字' svn://192.168.1.52/help/branches/help_forPmv2 svn://192.168.1.52/help/branches/help_forPmv2_141010
revert:
不小心寫錯了很多東西,想撤銷所寫的東西(還未把修改提交到服務器)
svn revert
去掉所有代碼的修改
svn revert --depth infinity . //“ .” 空格 + 點
merge:
合并到哪一個文件。。。。。
將100合并成(取代) 101
svn merge -r uprev:lowrev .
eg : svn merge -r 101:100 .
PS : svn 提交,如果版本號低的話,merge是合拼不了的
恢復svn服務器上某個版本號
svn merge -c -12213 .
svn merge -c -123456 -234234 . //恢復多個
copy:
拷貝文件
svn copy path/file_name newpath/new_file_name //從path復制到新的路徑
svn commit -m "xxxx"
export: 自動忽略 .a .framework文件 (不帶版本號)。copy 不會
備份代碼的時候用export
svn copy path/file_name newpath/new_file_name //從path復制到新的路徑
svn commit -m "xxxx"
創建分支要用copy,這樣會有版本號,合并的時候,可以指定那個版本號合并到哪個版本號。。
//切出指定版本
svn copy svn://192.168.1.52/help/branches/help_forShop_140307 -r 170 svn://192.168.1.52/help/branches/help_forPm_141010 -m "切出分支"
commit/ci:
提交改動:
svn ci -m "<#備注#>" // -m "提交備注"
或者svn commit
例如:svn commit -m “add test file for my test“ test.php
delete:
場景1:刪除svn服務器中的文件,保存本地文件,這樣可以在忽略文件,因為不能直接對服務器中的代碼ignore操作。
svn delete "文件" --keep-local
場景1:刪除文件,并上傳:
svn delete test.php
svn ci -m "delete test file"
add:
加入文件:
svn add test.php(添加test.php)
svn add *.php(添加當前目錄下所有的php文件)
如果你會希望添加所有工作拷貝的未版本化文件,包括那些隱藏在深處的文件,可以使用svn add的--force遞歸到版本化的目錄下:
svn add . --force
如果是copy過來的文件夾有.svn 會有問題,所以要先刪除
ls -al 查看
rm -rf .svn 刪除
svn:
顯示文件的狀態
svn st
查找有沒有 .al結尾的文件,并顯示狀態
svn status --no-ignore | grep -i ".al$"
-- : 代表 用一個單詞
- : 分割兩個單詞
| : 管道傳輸,把前面的結果傳過來
svn標志的含義:
標志 | 狀態 |
---|---|
" " | 無修改 |
K | 被鎖定 |
A | 增加(Added) |
D | 刪除(Deleted) |
I | 忽略(Ignored) |
M | 改變(Modified) |
MM | 文件的屬性和內容都被改變了 |
U | 表示更新(Updated) |
UU | 文件的屬性和內容都更新了 |
C | 沖突(Conflicted) |
G | 合并(Merged) |
E | 已經存在(Existed) |
R | 替換(Replaced) |
X | 未納入版本控制的目錄,被外部引用的目錄所創建 |
? | 未納入版本控制,需要執行 svn add |
! | 該項目已遺失(被非 svn 命令刪除)或不完整 |
~ | 版本控制下的項目與其它類型的項目重名 |
沖突解決:
mc(使用本地的覆蓋服務器的)
tc(使用服務器的覆蓋本地的)
-
p ( 對比 )
選擇p后,會有本地會有三個文件,未沖突前、Mine、上一個版本號。對比沖突點,選擇需要的代碼,刪除>>>mine >>>>re 等標識。最后命令行svn resovled (文件名) 來確定解決沖突)或者通過SVN工具resovled
svn修改需要忽略的文件:
1、打開配置 open -e ~/.subversion/config
2、在配置中:global-ignores 后面添加。常見是:
global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo *.gcda *.gcno .DS_Store Thumbs.db .git .gitignore .idea xcuserdata *.xcuserdatad !xcshareddata
3、直接保存退出
如果需要臨時添加被忽略文件,可以使用
svn add <#制定文件名#> --force
常見錯誤:
提示out of date:
原因:你的本地倉庫的代碼不是最新的情況下:你提交的代碼服務器有最新的,你當前提交的代碼可能與服務器的代碼沖突
解決:先update,有沖突就解決沖突再commit,沒有沖突就直接commit。
is scheduled for addition, but is missing
原因:刪除文件夾后點commit提交,但是報錯。之前用SVN提交過的文件,被標記為"add"狀態,等待被加入到倉庫。若此時你把這個文件刪除了,SVN提交的時候還是會嘗試提交這個文件,雖然它的狀態已經是"missing"了。
解決:在命令行下用 "svn revert xxx.c --depth infinity",或者在圖形界面下,右鍵--Revert,選中那個文件。這樣就告訴SVN把這個文件退回到之前的狀態 "unversioned",也就是不對這個文件做任何修改