本文目錄一、SVN概述二、SVN服務(wù)器搭建和使用:三、使用svn客戶端功能四、使用注意事項(xiàng) 一,SVN概述* 什么是SVN(Subversion)? 答:簡(jiǎn)單的說(shuō),您可以把SVN當(dāng)成您的備份服務(wù)器,更好的是,他...
一、SVN概述
二、SVN服務(wù)器搭建和使用:
三、使用svn客戶端功能
四、使用注意事項(xiàng)
答:簡(jiǎn)單的說(shuō),您可以把SVN當(dāng)成您的備份服務(wù)器,更好的是,他可以幫您記住每次上傳到這個(gè)服務(wù)器的檔案內(nèi)容。并且自動(dòng)的賦予每次的變更一個(gè)版本。
通常,我們稱(chēng)用來(lái)存放上傳檔案的地方就做Repository。用中文來(lái)說(shuō),有點(diǎn)像是檔案?jìng)}庫(kù)的意思。不過(guò),通常我們還是使用Repository這個(gè)名詞。
基本上,第一次我們需要有一個(gè)新增(add)檔案的動(dòng)作,將想要備份的檔案放到Repository上面。日后,當(dāng)您有任何修改時(shí),都可以上傳到Repository上面,上傳已經(jīng)存在且修改過(guò)的檔案就叫做commit,也就是提交修改給SVN
server的意思。針對(duì)每次的commit,SVN
server都會(huì)賦予他一個(gè)新的版本。同時(shí),也會(huì)把每次上傳的時(shí)間記錄下來(lái)。日后,因?yàn)槟承┮蛩?,如果您需要從Repository下載曾經(jīng)提交的檔案。您可以直接選擇取得最新的版本,也可以取得任何一個(gè)之前的版本。如果忘記了版本,還是可以靠記憶嘗試取得某個(gè)日期的版本。
1. trunk主干
trunk就是開(kāi)發(fā)的主線,一般項(xiàng)目都是導(dǎo)入到主線來(lái)開(kāi)發(fā)的。
2. branches分支
branches一般是trunk某個(gè)版本的拷貝,如果你想在某一段時(shí)間單獨(dú)對(duì)某個(gè)功能進(jìn)行開(kāi)發(fā),而不像和其它功能混在一起,這時(shí)候branches是一個(gè)很好用的方式。你不會(huì)想 在trunk里一直開(kāi)發(fā)這個(gè)功能,不提交,直到開(kāi)發(fā)完成吧。一般也會(huì)合并的trunk中的。
3. tags標(biāo)簽
tags就是標(biāo)簽,顧名思義,就是某個(gè)版本的記錄啦,就好像看一本厚厚的,看到哪一頁(yè)了,做個(gè)記號(hào),方便以后查閱。
迭代開(kāi)發(fā)時(shí),在某個(gè)版本發(fā)布應(yīng)用,為了做個(gè)記錄,這時(shí)候打個(gè)tag很實(shí)用。發(fā)布后,線上出現(xiàn)了一個(gè)bug,可以根據(jù)這個(gè)tag進(jìn)行修復(fù)再發(fā)版本。
第一步:我們先在文稿目錄(~/Documents)下創(chuàng)建新建一個(gè) svn 目錄,后面我們會(huì)把多個(gè)倉(cāng)庫(kù)目錄都放在這里面。
圖一
圖二
第二步:打開(kāi)終端,執(zhí)行如下命令,創(chuàng)建一個(gè)名為 TestCode的倉(cāng)庫(kù)。
1 | svnadmin create /Users/liangxiaolong/Documents/SVN/TestCode |
圖三
倉(cāng)庫(kù)里的目錄結(jié)構(gòu)如下
圖四
在 svn/TestCode/conf 文件夾中有如下文件,我們需要分別進(jìn)行修改。
圖五
第一步:打開(kāi)svnserve.conf,將下列配置項(xiàng)前面的#和空格都去掉
圖六
注意: anon-access = read代表匿名訪問(wèn)的時(shí)候是只讀的,若改為anon-access = none代表禁止匿名訪問(wèn),需要帳號(hào)密碼才能訪問(wèn)
第二步:修改 passwd。在 [users]下面添加帳號(hào)和密碼(這里我配置了兩個(gè)用戶)
圖七
備注:# liangxiaolong(賬號(hào)) = liangxiaolong(密碼)
第三步:打開(kāi)authz,配置用戶組和權(quán)限
我們可以將在passwd里添加的用戶分配到不同的用戶組里,以后的話,就可以對(duì)不同用戶組設(shè)置不同的權(quán)限,沒(méi)有必要對(duì)每個(gè)用戶進(jìn)行單獨(dú)設(shè)置權(quán)限。
在[groups]下面添加組名和用戶名,多個(gè)用戶之間用逗號(hào)(,)隔開(kāi)
1 2 | [groups] topgroup=mj,jj |
說(shuō)明mj和jj都是屬于topgroup這個(gè)組的,接下來(lái)再進(jìn)行權(quán)限配置。
使用[/]代表svn服務(wù)器中的所有資源庫(kù)
1 2 | [/] @topgroup =rw |
上面的配置說(shuō)明topgroup這個(gè)組中的所有用戶對(duì)所有資源庫(kù)都有讀寫(xiě)(rw)權(quán)限,組名前面要用@
如果是用戶名,不用加@,比如mj這個(gè)用戶有讀寫(xiě)權(quán)限
1 2 | [/] mj=rw |
而topgroup分組的用戶只有對(duì) code1 有讀寫(xiě)權(quán)限。
1 | [/code1]<br> @topgroup = liangxiaolong |
前面配置了這么多,最關(guān)鍵還是看能否正常啟動(dòng)服務(wù)器,若啟動(dòng)不來(lái),前面做再多工作也是徒勞。
在終端輸入下列指令:
1 | svnserve -d -r /Users/liangxiaolong/Documents/SVN/ |
或者輸入:
1 | svnserve -d -r /Users/liangxiaolong/Documents/SVN/TestCode |
沒(méi)有任何提示就說(shuō)明啟動(dòng)成功了
1 | 打開(kāi)“活動(dòng)監(jiān)視器” 。搜索 svn,將進(jìn)程強(qiáng)制退出即可。 |
以下是一些常用命令
1、從本地導(dǎo)入代碼到服務(wù)器(第一次初始化導(dǎo)入)
在終端中輸入
svn import /Users/apple/Documents/eclipse_workspace/weibo svn://localhost/mycode/weibo --username=mj --password=123 -m "初始化導(dǎo)入"
指令的意思:將/Users/apple/Documents/eclipse_workspace/weibo中的所有內(nèi)容,上傳到服務(wù)器mycode倉(cāng)庫(kù)的weibo目錄下,后面雙引號(hào)中的"初始化導(dǎo)入"是注釋
2、從服務(wù)器端下載代碼到客戶端本地
在終端中輸入
1 | svn checkout svn: //localhost/mycode --username=mj --password=123 /Users/apple/Documents/code |
指令的意思:將服務(wù)器中mycode倉(cāng)庫(kù)的內(nèi)容下載到/Users/apple/Documents/code目錄中
簡(jiǎn)寫(xiě):
1 | svn co svn: //localhost/mycode --username=mj --password=123 /Users/apple/Documents/code |
注意:
* 如果不帶--password 參數(shù)傳輸密碼的話,會(huì)提示輸入密碼,建議不要用明文的--password 選項(xiàng)。
* 其中 username 與 password前是兩個(gè)短線,不是一個(gè)。
* 不指定本地目錄全路徑,則檢出到當(dāng)前目錄下。
3.提交更改過(guò)的代碼到服務(wù)器
在步驟2中已經(jīng)將服務(wù)器端的代碼都下載到/Users/apple/Documents/code目錄中,現(xiàn)在修改下里面的一些代碼,然后提交這些修改到服務(wù)器
1> 打開(kāi)終端,先定位到/Users/apple/Documents/code目錄,輸入:cd /Users/apple/Documents/code
2> 輸入提交指令:svn commit -m "修改了main.m文件"
這個(gè)指令會(huì)將/Users/apple/Documents/code下的所有修改都同步到服務(wù)器端,假如這次我只修改了main.文件
可以看到終端的打印信息:
1 2 3 | Sending weibo/weibo/main.m Transmitting file data . Committed revision |
必須帶上-m參數(shù),參數(shù)可以為空,但是必須寫(xiě)上-m
例子:
svn commit -m “提交當(dāng)前目錄下的全部在版本控制下的文件“ * <- 注意這個(gè)*表示全部文件
svn commit -m “提交我的測(cè)試用test.php“ test.php
svn commit -m “提交我的測(cè)試用test.php“ -N --no-unlock test.php <- 保持鎖就用–no-unlock開(kāi)關(guān)
svn ci -m “提交當(dāng)前目錄下的全部在版本控制下的文件“ * <- 注意這個(gè)*表示全部文件
svn ci -m “提交我的測(cè)試用test.php“ test.php
svn ci -m “提交我的測(cè)試用test.php“ -N --no-unlock test.php <- 保持鎖就用–no-unlock開(kāi)關(guān)
4、導(dǎo)出(導(dǎo)出一個(gè)干凈的不帶.svn文件夾的目錄樹(shù))
svn export [-r 版本號(hào)] http://路徑(目錄或文件的全路徑) [本地目錄全路徑] --username 用戶名
svn export [-r 版本號(hào)] svn://路徑(目錄或文件的全路徑) [本地目錄全路徑] --username 用戶名
svn export 本地檢出的(即帶有.svn文件夾的)目錄全路徑 要導(dǎo)出的本地目錄全路徑
注:第一種從版本庫(kù)導(dǎo)出干凈工作目錄樹(shù)的形式是指定URL,
如果指定了修訂版本號(hào),會(huì)導(dǎo)出相應(yīng)的版本,
如果沒(méi)有指定修訂版本,則會(huì)導(dǎo)出最新的,導(dǎo)出到指定位置。
如果省略 本地目錄全路徑,URL的最后一部分會(huì)作為本地目錄的名字。
第二種形式是指定 本地檢出的目錄全路徑 到 要導(dǎo)出的本地目錄全路徑,所有的本地修改將會(huì)保留,
但是不在版本控制下(即沒(méi)提交的新文件,因?yàn)?svn文件夾里沒(méi)有與之相關(guān)的信息記錄)的文件不會(huì)拷貝。
例子:
svn export svn://localhost/測(cè)試工具 /home/testtools --username wzhnsc
svn export svn://localhost/test/testapp --username wzhnsc
svn export /home/testapp /home/testtools
5、添加新文件
1 | svn add 文件名 |
注:告訴SVN服務(wù)器要添加文件了,還要用svn commint -m真實(shí)的上傳上去!
例子:
svn add test.php <- 添加test.php
svn commit -m “添加我的測(cè)試用test.php“ test.php
svn add *.php <- 添加當(dāng)前目錄下所有的php文件
svn commit -m “添加我的測(cè)試用全部php文件“ *.php
6、更新文件
1 2 3 | svn update svn update -r 修正版本 文件名 svn update 文件名 |
例子:
svn update <- 后面沒(méi)有目錄,默認(rèn)將當(dāng)前目錄以及子目錄下的所有文件都更新到最新版本
svn update -r 200 test.cpp <- 將版本庫(kù)中的文件 test.cpp 還原到修正版本(revision)200
svn update test.php <- 更新與版本庫(kù)同步。
提交的時(shí)候提示過(guò)期沖突,需要先 update 修改文件,
然后清除svn resolved,最后再提交commit。
7、刪除文件
1 2 3 4 | svn delete svn: //路徑(目錄或文件的全路徑) -m “刪除備注信息文本” 推薦如下操作: svn delete 文件名 svn ci -m “刪除備注信息文本” |
例子:
svn delete svn://localhost/testapp/test.php -m “刪除測(cè)試文件test.php”
推薦如下操作:
1 2 | svn delete test.php svn ci -m “刪除測(cè)試文件test.php” |
8、加鎖/解鎖
1 2 | svn lock -m “加鎖備注信息文本“ [--force] 文件名 svn unlock 文件名 |
例子:
svn lock -m “鎖信測(cè)試用test.php文件“ test.php
svn unlock test.php
9、比較差異
1 2 | svn diff 文件名 svn diff -r 修正版本號(hào)m:修正版本號(hào)n 文件名 |
例子:
svn diff test.php <-將修改的文件與基礎(chǔ)版本比較
svn diff -r 200:201 test.php <- 對(duì) 修正版本號(hào)200 和 修正版本號(hào)201 比較差異
10、查看文件或者目錄狀態(tài)
1 2 3 4 5 6 7 8 | svn st 目錄路徑/名 svn status 目錄路徑/名<- 目錄下的文件和子目錄的狀態(tài),正常狀態(tài)不顯示 【?:不在svn的控制中; M:內(nèi)容被修改;C:發(fā)生沖突; A:預(yù)定加入到版本庫(kù);K:被鎖定】 svn -v 目錄路徑/名 svn status -v 目錄路徑/名<- 顯示文件和子目錄狀態(tài) 【第一列保持相同,第二列顯示工作版本號(hào), 第三和第四列顯示最后一次修改的版本號(hào)和修改人】 |
注:svn status、svn diff和 svn revert這三條命令在沒(méi)有網(wǎng)絡(luò)的情況下也可以執(zhí)行的,
原因是svn在本地的.svn中保留了本地版本的原始拷貝。
11、查看日志
1 | svn log 文件名 |
例子:
svn log test.php<- 顯示這個(gè)文件的所有修改記錄,及其版本號(hào)的變化
12、查看文件詳細(xì)信息
1 | svn info 文件名 |
例子:
svn info test.php
13、SVN 幫助
1 2 | svn help <- 全部功能選項(xiàng) svn help ci <- 具體功能的說(shuō)明 |
14、查看版本庫(kù)下的文件和目錄列表
1 2 | svn list svn: //路徑(目錄或文件的全路徑) svn ls svn: //路徑(目錄或文件的全路徑) |
例子:
1 2 | svn list svn: //localhost/test svn ls svn: //localhost/test <- 顯示svn://localhost/test目錄下的所有屬于版本庫(kù)的文件和目錄 |
15、創(chuàng)建納入版本控制下的新目錄
1 2 | svn mkdir 目錄名 svn mkdir -m "新增目錄備注文本" http: //目錄全路徑 |
例子:
1 2 | svn mkdir newdir svn mkdir -m "Making a new dir." svn: //localhost/test/newdir |
注:添加完子目錄后,一定要回到根目錄更新一下,不然在該目錄下提交文件會(huì)提示“提交失敗”
1 | svn update |
注:如果手工在checkout出來(lái)的目錄里創(chuàng)建了一個(gè)新文件夾newsubdir,
再用svn mkdir newsubdir命令后,
SVN會(huì)提示:
svn: 嘗試用 “svn add”或 “svn add --non-recursive”代替?
svn: 無(wú)法創(chuàng)建目錄“hello”: 文件已經(jīng)存在
此時(shí),用如下命令解決:
1 | svn add --non-recursive newsubdir |
在進(jìn)入這個(gè)newsubdir文件夾,用ls -a查看它下面的全部目錄與文件,會(huì)發(fā)現(xiàn)多了:.svn目錄
再用 svn mkdir -m "添hello功能模塊文件" svn://localhost/test/newdir/newsubdir 命令,
SVN提示:
svn: File already exists: filesystem '/data/svnroot/test/db', transaction '4541-1',
path '/newdir/newsubdir '
16、恢復(fù)本地修改
1 | svn revert [--recursive] 文件名 |
注意: 本子命令不會(huì)存取網(wǎng)絡(luò),并且會(huì)解除沖突的狀況。但是它不會(huì)恢復(fù)被刪除的目錄。
例子:
1 2 | svn revert foo.c <- 丟棄對(duì)一個(gè)文件的修改 svn revert --recursive . <-恢復(fù)一整個(gè)目錄的文件,. 為當(dāng)前目錄 |
17、把工作拷貝更新到別的URL
1 | svn switch http: //目錄全路徑 本地目錄全路徑 |
例子:
1 | svn switch http: //localhost/test/456 . <- (原為123的分支)當(dāng)前所在目錄分支到localhost/test/456 |
18、解決沖突
1 | svn resolved [本地目錄全路徑] |
例子:
1 2 3 | $ svn update C foo.c Updated to revision 31. |
如果你在更新時(shí)得到?jīng)_突,你的工作拷貝會(huì)產(chǎn)生三個(gè)新的文件:
$ ls
foo.c
foo.c.mine
foo.c.r30
foo.c.r31
當(dāng)你解決了foo.c的沖突,并且準(zhǔn)備提交,運(yùn)行svn resolved讓你的工作拷貝知道你已經(jīng)完成了所有事情。
你可以僅僅刪除沖突的文件并且提交,但是svn resolved除了刪除沖突文件,還修正了一些記錄在工作拷貝管理區(qū)域的記錄數(shù)據(jù),所以我們推薦你使用這個(gè)命令。
19、不checkout而查看輸出特定文件或URL的內(nèi)容
1 | svn cat http: //文件全路徑 |
例子:
1 | svn cat http: //localhost/test/readme.txt |
20、新建一個(gè)分支copy
1 | svn copy branchA branchB -m "make B branch" // 從branchA拷貝出一個(gè)新分支branchB |
21、合并內(nèi)容到分支merge
1 | svn merge branchA branchB // 把對(duì)branchA的修改合并到分支branchB |
來(lái)源:本文內(nèi)容搜集或轉(zhuǎn)自各大網(wǎng)絡(luò)平臺(tái),并已注明來(lái)源、出處,如果轉(zhuǎn)載侵犯您的版權(quán)或非授權(quán)發(fā)布,請(qǐng)聯(lián)系小編,我們會(huì)及時(shí)審核處理。
聲明:江蘇教育黃頁(yè)對(duì)文中觀點(diǎn)保持中立,對(duì)所包含內(nèi)容的準(zhǔn)確性、可靠性或者完整性不提供任何明示或暗示的保證,不對(duì)文章觀點(diǎn)負(fù)責(zé),僅作分享之用,文章版權(quán)及插圖屬于原作者。
Copyright©2013-2025 ?JSedu114 All Rights Reserved. 江蘇教育信息綜合發(fā)布查詢平臺(tái)保留所有權(quán)利
蘇公網(wǎng)安備32010402000125
蘇ICP備14051488號(hào)-3技術(shù)支持:南京博盛藍(lán)睿網(wǎng)絡(luò)科技有限公司
南京思必達(dá)教育科技有限公司版權(quán)所有 百度統(tǒng)計(jì)