我們首先來看下,如何在Mac環境下搭建svn服務器端環境。
一、創建代碼倉庫,用來存儲客戶端所上傳的代碼
我先在/User/apple目錄下新建一個svn目錄,以後可以在svn目錄下創建多個倉庫目錄
打開終端,創建一個mycode倉庫,輸入指令:svnadmin create /Users/apple/svn/mycode
注:這地方出現路徑的錯誤可以通過
輸入sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer命令
password是你的登錄密碼。
二、配置svn的用戶權限
主要是修改/svn/mycode/conf目錄下的三個文件
1.打開svnserve.conf,將下列配置項前面的#和空格都去掉
1
2
3
4
5
6
|
# anon-access = read # auth-access = write # password-db = passwd # authz-db = authz |
anon-access = read代表匿名訪問的時候是隻讀的,若改爲anon-access = none代表禁止匿名訪問,需要帳號密碼才能訪問
2.打開passwd,在[users]下面添加帳號和密碼
[users]
mj=123
jj=456
帳號是mj,密碼是123
3.打開authz,配置用戶組和權限
我們可以將在passwd裏添加的用戶分配到不同的用戶組裏,以後的話,就可以對不同用戶組設置不同的權限,沒有必要對每個用戶進行單獨設置權限。
在[groups]下面添加組名和用戶名,多個用戶之間用逗號(,)隔開
[groups]
topgroup=mj,jj
說明mj和jj都是屬於topgroup這個組的,接下來再進行權限配置。
使用[/]代表svn服務器中的所有資源庫
[/]
@topgroup=rw上面的配置說明topgroup這個組中的所有用戶對所有資源庫都有讀寫(rw)權限,組名前面要用@
如果是用戶名,不用加@,比如mj這個用戶有讀寫權限
[/]
mj=rw
至於其他精細的權限控制,可以參考authz文件中的其他內容
4.啓動svn服務器
前面配置了這麼多,最關鍵還是看能否正常啓動服務器,若啓動不來,前面做再多工作也是徒勞。
在終端輸入下列指令:svnserve -d -r /Users/apple/svn
或者輸入:svnserve -d -r /Users/apple/svn/mycode
沒有任何提示就說明啓動成功了
5.關閉svn服務器
如果你想要關閉svn服務器,最有效的辦法是打開實用工具裏面的“活動監視器”
這裏列出一大堆svn指令,後面括號中的內容的一般代表着指令的簡稱,比如我們可以用svn ci代替svn commit,用svn co代替svn checkout
注:首次配置完先關閉svn服務器再進行數據的上傳和下載操作。
綜合上述,我們就可以輕鬆搭建svn服務器環境了
三、使用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目錄下,後面雙引號中的"初始化導入"是註釋
注:apple是用戶名
2.從服務器端下載代碼到客戶端本地
在終端中輸入svn checkout svn://localhost/mycode --username=mj --password=123 /Users/apple/Documents/code
我解釋下指令的意思:將服務器中mycode倉庫的內容下載到/Users/apple/Documents/code目錄中
注:localhost(本地服務器IP地址)可以替換成你本地服務器的IP地址。當你和別人同用一個svn時,你可以輸入你要進行數據請求的服務器的IP地址。
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.文件
可以看到終端的打印信息:
Sending weibo/weibo/main.m
Transmitting file data .
Committed revision 2.
4.更新服務器端的代碼到客戶端
這個應該是最簡單的指令了,在終端中定位到客戶端代碼目錄後,比如上面的/Users/apple/Documents/code目錄,然後再輸入指令:svn update
5.至於svn的其他用法,可以在終端輸入:svn help
注:1、系統自帶的svn無法支持本地刪除文件的更新,即當本地刪除文件後去更新服務器的文件時,刪除的文件又從服務器上的文件夾中下載到你的本地文件夾中。但是它是支持文件修改後的更新操作的。
2、記得寫註釋,否則系統不會識別命令的。
打開終端,進到所在的目錄,然後出入一下代碼
find . -name ".svn" | xargs rm -Rf
1、將文件checkout到本地目錄
svn checkout path(path是服務器上的目錄)
例如:svn checkout svn://192.168.1.1/pro/domain
簡寫:svn co
2、往版本庫中添加新的文件
svn add file
例如:svn add test.PHP(添加test.php)
svn add *.php(添加當前目錄下所有的php文件)
svn add [email protected] 文件時, 正常命令 svn add [email protected] 會報 xxx not found
需用 svn add [email protected]@ 來添加,也就是圖片名字後面再添加一個@ 符號,
這是因爲 svn 命令最後需要用@符號來指定一個版本導致的
遇到 [email protected]文件時,如果用svn命令行添加到 版本庫的話,只能手動一個一個添加,不能批量添加
3、將改動的文件提交到版本庫
svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果選擇了保持鎖,就使用–no-unlock開關)
例如:svn commit -m “add test file for my test“ test.php
簡寫:svn ci
4、加鎖/解鎖
svn lock -m “LockMessage“ [--force] PATH
例如:svn lock -m “lock test file“ test.php
svn unlock PATH
5、更新到某個版本
svn update -r m path
例如:
svn update如果後面沒有目錄,默認將當前目錄以及子目錄下的所有文件都更新到最新版本。
svn update -r 200 test.php(將版本庫中的文件test.php還原到版本200)
svn update test.php(更新,於版本庫同步。如果在提交的時候提示過期的話,是因爲衝突,需要先update,修改文件,然後清除svn resolved,最後再提交commit)
簡寫:svn up
6、查看文件或者目錄狀態
1)svn status path(目錄下的文件和子目錄的狀態,正常狀態不顯示)
【?:不在svn的控制中;M:內容被修改;C:發生衝突;A:預定加入到版本庫;K:被鎖定】
2)svn status -v path(顯示文件和子目錄狀態)
第一列保持相同,第二列顯示工作版本號,第三和第四列顯示最後一次修改的版本號和修改人。
注:svn status、svn diff和 svn revert這三條命令在沒有網絡的情況下也可以執行的,原因是svn在本地的.svn中保留了本地版本的原始拷貝。
簡寫:svn st
7、刪除文件
svn delete path -m “delete test fle“
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”
或者直接svn delete test.php 然後再svn ci -m ‘delete test file‘,推薦使用這種
簡寫:svn (del, remove, rm)
8、查看日誌
svn log path
例如:svn log test.php 顯示這個文件的所有修改記錄,及其版本號的變化
9、查看文件詳細信息
svn info path
例如:svn info test.php
10、比較差異
svn diff path(將修改的文件與基礎版本比較)
例如:svn diff test.php
svn diff -r m:n path(對版本m和版本n比較差異)
例如:svn diff -r 200:201 test.php
簡寫:svn di
11、將兩個版本之間的差異合併到當前文件
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(將版本200與205之間的差異合併到當前文件,但是一般都會產生衝突,需要處理一下)
12、SVN 幫助
svn help
svn help ci
13、版本庫下的文件和目錄列表
svn list path
顯示path目錄下的所有屬於版本庫的文件和目錄
簡寫:svn ls
14、創建納入版本控制下的新目錄
svn mkdir: 創建納入版本控制下的新目錄。
用法: 1、mkdir PATH…
2、mkdir URL…
創建版本控制的目錄。
1、每一個以工作副本 PATH 指定的目錄,都會創建在本地端,並且加入新增
調度,以待下一次的提交。
2、每個以URL指定的目錄,都會透過立即提交於倉庫中創建。
在這兩個情況下,所有的中間目錄都必須事先存在。
15、恢復本地修改
svn revert: 恢復原始未改變的工作副本文件 (恢復大部份的本地修改)。revert:
用法: revert PATH…
注意: 本子命令不會存取網絡,並且會解除衝突的狀況。但是它不會恢復
被刪除的目錄
16、代碼庫URL變更
svn switch (sw): 更新工作副本至不同的URL。
用法: 1、switch URL [PATH]
2、switch –relocate FROM TO [PATH...]
1、更新你的工作副本,映射到一個新的URL,其行爲跟“svn update”很像,也會將
服務器上文件與本地文件合併。這是將工作副本對應到同一倉庫中某個分支或者標記的
方法。
2、改寫工作副本的URL元數據,以反映單純的URL上的改變。當倉庫的根URL變動
(比如方案名或是主機名稱變動),但是工作副本仍舊對映到同一倉庫的同一目錄時使用
這個命令更新工作副本與倉庫的對應關係。
17、解決衝突
svn resolved: 移除工作副本的目錄或文件的“衝突”狀態。
用法: resolved PATH…
注意: 本子命令不會依語法來解決衝突或是移除衝突標記;它只是移除衝突的
相關文件,然後讓 PATH 可以再次提交。
18、輸出指定文件或URL的內容。
svn cat 目標[@版本]…如果指定了版本,將從指定的版本開始查找。
svn cat -r PREV filename > filename (PREV 是上一版本,也可以寫具體版本號,這樣輸出結果是可以提交的)
19、配置忽略文件 vi ~/.subversion/config
找到 global-ignores 一行,去掉註釋,編輯成
global-ignores = build *~.nib *.so *.pbxuser *.mode *.perspective*
找到 enable-auto-props = yes 把註釋去掉,在[auto-props] Section聲明以下文本文件
*.mode* = svn:mime-type=text/X-xcode
*.pbxuser = svn:mime-type=text/X-xcode
*.perspective* = svn:mime-type=text/X-xcode
*.pbxproj = svn:mime-type=text/X-xcode
=========================================
svn 命令共同的選項
--targets list 讀取list並將其解釋爲一個將要操作的參數列表
--non-recurisive, –N 只操作單個目錄,不處理子目錄
--verbose, –v 打印額外的信息
--quiet, –q 打印的信息儘可能少
--username, name 指定在連接授權時使用的用戶名
--password, pawd 指定要使用的密碼
--no-auth-cache 不要緩存身份令牌
--non-interactive 不要提示輸入額外的信息
--config-dir dir 從dir讀取用戶配置
--editor-cm cmd 使用cmd作爲日誌消息的編輯器
svn add
把文件及目錄的名稱添加給版本控制系統。他們會在下次提交時被添加到項目倉庫
svn add path
--auto-props 在添加他們的時候自動設置文件的屬性
--no-auto-props 禁用自動屬性設置
svn blame
顯示文件每行的版本及作者信息
--revision, –r rev 如果指定的rev是單個版本,顯示該版本作者信息。如果是範圍rev1:rev2, 顯示rev2版本作者的信息,但只檢查版本到rev1.
svn cat
輸出指定文件或者URL的內容
svn cat target…
--revision, –r rev
svn checkout
從項目倉庫牽出一個工作拷貝
svn checkout url…path
如果沒有指定path,簽出的本地目錄名使用URL的base name.
svn cleanup
清理工作拷貝,移除鎖,完成未完成的操作,等等。
svn cleanup path…
svn commit path
把改動從你的工作拷貝發送到項目倉庫
--message, –m msg 使用msg作爲提交日誌消息。
--file, –F file 使用file的內容作爲提交日誌消息。
--no-unlock 不要在提交的時候釋放鎖。
svn copy
在工作拷貝或者項目倉庫中製造包括歷史在內的複本
svn copy src dest
src和dest可以是工作拷貝(WC)的路徑或者URL.
src dest 效果……
WC WC 拷貝並添加
WC URL 立即提交WC的拷貝到URL
URL WC 簽出URL到WC, 添加
URL URL 完全服務器端拷貝;用於製作分支和打標籤
--revision, –r rev要拷貝的src的版本。只在src是項目倉庫的URL時纔有意義。
svn delete target
從項目倉庫刪除文件或者目錄。如果target是工作拷貝中的文件或者目錄,它被從工作拷貝中移除並且預計在下次提交時刪除掉。如果target是項目倉庫URL,通過一次立即的提交從項目倉庫中刪除。
--message, –m msg
--file, –F file
svn diff
顯示兩個路徑之間的差異
svn diff –r rev1:rev2 target…
svn diff oldurl newurl
svn export
創建一個無版本記錄的拷貝.
svn export –r rev URL path
從項目倉庫的指定URL導出一個乾淨的目錄樹到path中,如果指定了rev參數,導出rev版本的,否則到處最新版本。
svn import
提交一個無版本的文件或者樹到項目倉庫
svn import path URL
svn info
顯示文件或者目錄的信息。
svn list
列出項目倉庫中的目錄條數。
svn lock
鎖住文件讓其它用戶不能提交改動。
svn lock target
--message, –m msg 使用msg作爲鎖信息消息
--force 強制加鎖成功,通過從其他用戶或者工作拷貝把鎖給偷過來。
svn log
顯示一些版本或者文件的日誌消息.
--stop-on-copy 在遍歷歷史的時候不要穿越拷貝(對於查找分支的起點很有用)
svn merge
把兩個來源的差異應用給工作拷貝路徑。
svn merge –r rev1:rev2 source wcpath
svn mkdir
創建版本控制下的新目錄
svn mkdir target
svn move src dest
移動或者重命名工作拷貝或者項目倉庫中文件或者目錄。
--revision, –r rev使用版本rev作爲源來執行這次移動。
svn propdel
刪除文件或者目錄的屬性
svn propdel propname path…
svn propedit
編輯文件或者目錄的屬性
svn propedit propname path…
svn propget
打印文件或者目錄的屬性值
svn propget propname path…
--strict 禁用額外的換行和其它的美化措施(在把二進制屬性重定向到文件時會有用處)
svn proplist
列出文件或者目錄的所有屬性
--verbose
--recursive
--revision, –r rev 列出path在版本rev定義的屬性
svn propset(pset, ps)
svn propset propname propval path…
--file, –F file 讀取file的內容,使用它作爲屬性值.
--recursive
--encoding enc 把值作爲用enc編碼的字符集
svn resolved
移除工作拷貝文件或者目錄的衝突狀態
--recursive
svn revert
恢復工作拷貝的文件(撤銷最新的本地修改)
svn revert path 這個命令不需要網絡連接
--recursive
svn status
打印工作拷貝中文件或者目錄的狀態
svn status path…
--show-updates, –u 聯繫服務器顯示更新信息
--no-ignore 忽視默認設置和svn:ignore屬性設置的忽略項
--non-recursive, –N
--verbose, –v
svn switch
把工作拷貝轉向到其他的URL
svn switch URL path
更新工作拷貝讓其使用項目倉庫的新URL.這個行爲類似svn update 而且是一種把工作拷貝轉向到同一項目倉庫中的分支或者標籤的辦法。
--revision, –r rev 轉向到版本rev
--non-recursive, –N
--diff3-cm 使用cmd作爲合併命令
svn unlock
解開工作拷貝文件或者項目倉庫URL的鎖。
svn unlock target…
--force 砸壞現有對target的鎖,甚至它不是被當前工作拷貝所擁有的。
svn update
把改動從項目倉庫帶到工作拷貝來。
svn update path…
--revision, –r rev 更新到版本rev
--non-recrusive, –N
--diff3-cmd