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