基本概念:
svn 是在一個(gè)服務(wù)器中建立以個(gè)源代碼庫(kù)吉嚣,可以記錄每一個(gè)文件修改的記錄(每個(gè)源文件都有版本號(hào))皂吮,可以隨時(shí)回退到歷史版本样眠。開(kāi)發(fā)人員先要checkout代碼出來(lái)贬养,可以在修改后再commmit上去昼捍。svn是屬于集中式版本控制系統(tǒng)识虚,沒(méi)有網(wǎng)絡(luò)就不能co/ci了。
基本操作
update:
恢復(fù)到之前某個(gè)版本號(hào):
不小心寫(xiě)錯(cuò)了很多東西妒茬,想撤銷(xiāo)所寫(xiě)的東西(已經(jīng)把修改提交到服務(wù)器
svn update -r 版本號(hào)
不小心刪錯(cuò)了文件担锤,想把文件恢復(fù)回來(lái)(已經(jīng)把刪除提交到服務(wù)器)
svn update -r 版本號(hào)
checkout:
export = copy 一份,不會(huì)有倉(cāng)庫(kù)乍钻、check out = 引用
1肛循、Linux命令行下將文件checkout到本地目錄
svn checkout path(path是服務(wù)器上的目錄)//后面 空格 接需要checkout到的本地地址,如果沒(méi)有話(huà)银择,默認(rèn)當(dāng)時(shí)終端進(jìn)入的地址
svn checkout svn://192.168.1.1/pro/domain
svn co http://xxx/svn/xxxx --username=manager --password=manager
有時(shí)整個(gè) svn 目錄太過(guò)于龐大多糠,不想整個(gè) checkout 下來(lái),但又想維持整個(gè)目錄結(jié)構(gòu)以方便后續(xù)使用浩考,那么可以使用 subversion 1.5 之后的 –depth 參數(shù)來(lái)只 checkout 需要的子目錄夹孔。
1、先checkout空目錄
svn co --depth empty svnLocation localDir
對(duì)需要的子目錄遞歸checkout
svn update --set-depth infinity localDir/data
svn update --set-depth infinity localDir/block
eg:按路徑checkout出來(lái)
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
驗(yàn)證是否可以析孽,搭伤,進(jìn)入相對(duì)的文件夾,使用
svn stutas -u 看是不是有對(duì)應(yīng)的版本號(hào)就可以了
拿到的空目錄后袜瞬,就可以正常checkout對(duì)應(yīng)的路徑了怜俐。
move:
更改版本名稱(chēng):
svn move -m '*更改分支名字' svn://192.168.1.52/help/branches/help_forPmv2 svn://192.168.1.52/help/branches/help_forPmv2_141010
revert:
不小心寫(xiě)錯(cuò)了很多東西,想撤銷(xiāo)所寫(xiě)的東西(還未把修改提交到服務(wù)器)
svn revert
去掉所有代碼的修改
svn revert --depth infinity . //“ .” 空格 + 點(diǎn)
merge:
合并到哪一個(gè)文件邓尤。拍鲤。。裁赠。殿漠。
將100合并成(取代) 101
svn merge -r uprev:lowrev .
eg : svn merge -r 101:100 .
PS : svn 提交,如果版本號(hào)低的話(huà)佩捞,merge是合拼不了的
恢復(fù)svn服務(wù)器上某個(gè)版本號(hào)
svn merge -c -12213 .
svn merge -c -123456 -234234 . //恢復(fù)多個(gè)
copy:
拷貝文件
svn copy path/file_name newpath/new_file_name //從path復(fù)制到新的路徑
svn commit -m "xxxx"
export: 自動(dòng)忽略 .a .framework文件 (不帶版本號(hào))绞幌。copy 不會(huì)
備份代碼的時(shí)候用export
svn copy path/file_name newpath/new_file_name //從path復(fù)制到新的路徑
svn commit -m "xxxx"
創(chuàng)建分支要用copy,這樣會(huì)有版本號(hào),合并的時(shí)候一忱,可以指定那個(gè)版本號(hào)合并到哪個(gè)版本號(hào)莲蜘。谭确。
//切出指定版本
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:
提交改動(dòng):
svn ci -m "<#備注#>" // -m "提交備注"
或者svn commit
例如:svn commit -m “add test file for my test“ test.php
delete:
場(chǎng)景1:刪除svn服務(wù)器中的文件,保存本地文件票渠,這樣可以在忽略文件逐哈,因?yàn)椴荒苤苯訉?duì)服務(wù)器中的代碼ignore操作。
svn delete "文件" --keep-local
場(chǎng)景1:刪除文件问顷,并上傳:
svn delete test.php
svn ci -m "delete test file"
add:
加入文件:
svn add test.php(添加test.php)
svn add *.php(添加當(dāng)前目錄下所有的php文件)
如果你會(huì)希望添加所有工作拷貝的未版本化文件昂秃,包括那些隱藏在深處的文件,可以使用svn add的--force遞歸到版本化的目錄下:
svn add . --force
如果是copy過(guò)來(lái)的文件夾有.svn 會(huì)有問(wèn)題杜窄,所以要先刪除
ls -al 查看
rm -rf .svn 刪除
svn:
顯示文件的狀態(tài)
svn st
查找有沒(méi)有 .al結(jié)尾的文件,并顯示狀態(tài)
svn status --no-ignore | grep -i ".al$"
-- : 代表 用一個(gè)單詞
- : 分割兩個(gè)單詞
| : 管道傳輸肠骆,把前面的結(jié)果傳過(guò)來(lái)
svn標(biāo)志的含義:
標(biāo)志 | 狀態(tài) |
---|---|
" " | 無(wú)修改 |
K | 被鎖定 |
A | 增加(Added) |
D | 刪除(Deleted) |
I | 忽略(Ignored) |
M | 改變(Modified) |
MM | 文件的屬性和內(nèi)容都被改變了 |
U | 表示更新(Updated) |
UU | 文件的屬性和內(nèi)容都更新了 |
C | 沖突(Conflicted) |
G | 合并(Merged) |
E | 已經(jīng)存在(Existed) |
R | 替換(Replaced) |
X | 未納入版本控制的目錄,被外部引用的目錄所創(chuàng)建 |
? | 未納入版本控制塞耕,需要執(zhí)行 svn add |
! | 該項(xiàng)目已遺失(被非 svn 命令刪除)或不完整 |
~ | 版本控制下的項(xiàng)目與其它類(lèi)型的項(xiàng)目重名 |
沖突解決:
mc(使用本地的覆蓋服務(wù)器的)
tc(使用服務(wù)器的覆蓋本地的)
-
p ( 對(duì)比 )
選擇p后蚀腿,會(huì)有本地會(huì)有三個(gè)文件,未沖突前扫外、Mine莉钙、上一個(gè)版本號(hào)。對(duì)比沖突點(diǎn)筛谚,選擇需要的代碼磁玉,刪除>>>mine >>>>re 等標(biāo)識(shí)。最后命令行svn resovled (文件名) 來(lái)確定解決沖突)或者通過(guò)SVN工具resovled
svn修改需要忽略的文件:
1驾讲、打開(kāi)配置 open -e ~/.subversion/config
2蜀涨、在配置中:global-ignores 后面添加。常見(jiàn)是:
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蝎毡、直接保存退出
如果需要臨時(shí)添加被忽略文件,可以使用
svn add <#制定文件名#> --force
常見(jiàn)錯(cuò)誤:
提示out of date:
原因:你的本地倉(cāng)庫(kù)的代碼不是最新的情況下:你提交的代碼服務(wù)器有最新的氧枣,你當(dāng)前提交的代碼可能與服務(wù)器的代碼沖突
解決:先update沐兵,有沖突就解決沖突再commit,沒(méi)有沖突就直接commit便监。
is scheduled for addition, but is missing
原因:刪除文件夾后點(diǎn)commit提交扎谎,但是報(bào)錯(cuò)。之前用SVN提交過(guò)的文件烧董,被標(biāo)記為"add"狀態(tài)毁靶,等待被加入到倉(cāng)庫(kù)。若此時(shí)你把這個(gè)文件刪除了逊移,SVN提交的時(shí)候還是會(huì)嘗試提交這個(gè)文件预吆,雖然它的狀態(tài)已經(jīng)是"missing"了。
解決:在命令行下用 "svn revert xxx.c --depth infinity"胳泉,或者在圖形界面下拐叉,右鍵--Revert岩遗,選中那個(gè)文件。這樣就告訴SVN把這個(gè)文件退回到之前的狀態(tài) "unversioned"凤瘦,也就是不對(duì)這個(gè)文件做任何修改