如果剛到一個新公司,還要用 SVN ,接老項目,簡易 SVN 操作
一、創建代碼倉庫
1.首先在某個目錄下面新建一個svn文件夾,例如:/Users/hehui/Desktop (桌面目錄)下新建svn文件夾
命令:mkdir /Users/hehui/Desktop/svn
2.打開新建的svn文件夾
命令:cd /Users/hehui/Desktop/svn
3.在svn目錄下面創建一個倉庫 例如我將這個倉庫取名為FirstDemo
命令:svnadmin create FirstDemo
如果沒有任何提示,直接回到可以輸入的狀態就表明創建成功。命令執行成功后。
二、配置SVN
打開你的svn目錄下面的FirstDemo文件夾,你會發現里面多了幾個文件。
其中會包含一個conf的文件夾,打開里面有三個文件,
打開 svnserve.conf,找到以下的四行
anon-access =read
auth-access = write? ?
?password-db = passwd?
?? authz-db = authz
將每行前面的#和空格都刪除掉
打開passwd,在[users]下面添加帳號和密碼,比如:
hehui = 111111
stu01 = 000001
stu02 = 000002
賬號是hehui,密碼是111111
打開authz,配置用戶組和權限
我們可以將在passwd里添加的用戶分配到不同的用戶組里,以后的話,就可以對不同用戶組設置不同的權限,沒有必要對每個用戶進行單獨設置權限。
在[groups]下面添加組名和用戶名,多個用戶之間用逗號(,)隔開
[groups]
top = hehui
normal = stu01,stu02
說明hehui是屬于top這個組的,接下來再進行權限配置。
使用[/]代表svn服務器中的所有資源庫
[/]@top= rw
上面的配置說明top這個組中的所有用戶對所有資源庫都有讀寫(rw)權限,組名前面要用@。
如果是用戶名,不用加@,比如stu01這個用戶有只讀權限
[/]
stu01 = rw
如果我想讓stu02這個用戶在FirstDemo的Stu02Project(這個需要去創建)文件夾里面擁有只讀權限
[/FirstDemo:/Stu02Project]stu02 = r
上面FirstDemo是倉庫名,后面是倉庫里面的文件夾目錄。
在實際使用過程中需要根據不同的用戶配置不同文件夾的權限
啟動svn服務器
在你的svn目錄下面,如果當前目錄被你更換了,請回到svn文件夾的目錄(例如我的,在終端輸入:cd /Users/hehui/Desktop/svn)。
在終端輸入下列指令:svnserve -d -r FirstDemo
沒有任何提示說明啟動成功了
關閉svn服務器
如果你想要關閉svn服務器,最有效的辦法是打開實用工具里面的“活動監視器”
搜索svn,點擊左上角X按鈕關閉。
三、使用svn客戶端功能
1.從本地導入代碼到svn服務器(第一次導入初始化)
在終端中輸入:svn import /User/hehui/Desktop/SvnTestsvn://localhost/FirstDemo/SvnTest--username=hehui --password=111111 -m "第一次初始化導入"
這里的/User/hehui/Desktop/SvnTest 是你的工程的目錄
svn://localhost/FirstDemo/SvnTest是svn服務器中的SvnTest目錄,如果是其它主機的服務器,需要將localhost替換成其它主機的ip地址,例如:192.168.1.111
-m 后面雙引號里面內容是注釋
2.從svn服務器上面下載代碼到本地
在終端中輸入:svn checkoutsvn://localhost/FirstDemo/User/hehui/Desktop/Zaizheli
這里是從svn服務器中將FirstDemo倉庫中的所有內容下載到/User/hehui/Desktop/Zaizheli目錄中。
注意這里的/User/hehui/Desktop/Zaizheli不再是你第一次上傳的那個文件的目錄,這是一個本地代碼倉庫
3.提交更改過的代碼到svn服務器
在步驟2中已經將服務器端的代碼都下載到/Users/hehui/Desktop/Zaizheli目錄中,現在修改下里面的一些代碼,然后提交這些修改到服務器
1.打開終端,先定位到/Users/hehui/Desktop/Zaizheli目錄中,隨便修改一下代碼,然后提交這些修改
2.輸入提交指令:svn commit -m "修改了一些代碼",這個指定會將/Users/hehui/Desktop/Zaizheli目錄下所有的修改都同步到服務器端。
4.更新svn服務器代碼到本地
在終端中定位到/Users/hehui/Desktop/Zaizheli本地代碼倉庫,然后在終端中輸入指令:svn update
###############
###使用 SVN (終端命令)**1.** 從本地導入代碼到服務器(第一次初始化導入)- 在終端輸入: `svnimport/Users/apple/Documents/workspace/wenhangtest svn://localhost/mycode/iOS/wenhangtest --username=wenhang --password=111 -m "初始化導入"`> 詳解指令: 將/Users/apple/Documents/workspace/wenhangtest中的所有內容,上傳到服務器mycode倉庫的iOS/wenhangtest目錄下,后面雙引號中的"初始化導入"是注釋**
2.** 從服務器下載代碼到客戶端本地- 方式一 在終端輸入: `svn checkout svn://localhost/mycode/iOS --username=wenhang --password=111 /Users/apple/Documents/code` ----------- - 方式二 在終端中進入預先建好下載存放文檔的目錄文件夾 終端輸入: `svn checkout svn://localhost/mycode/iOS --username=wenhang --password=111`>詳解指令: 將服務器 mycode/iOS 倉庫中的內容下載到/ User/apple/Documents/code 目錄中**
3.** 提交更改過得代碼到服務器1. 首先更新服務器端的代碼到客戶端`(為避免多人協作,svn出現沖突,此步驟須執行,且養成`先up, 再commit` 的好習慣)`如果是第一次提交,可不執行 up 步驟2. 提交代碼: - 打開終端,先定位到/ Users/apple/Documents/code 目錄中, 輸入:` cd/Users/apple/Documents/code` - 輸入提交指令: `svn commit -m"測試修改 .main 文件"`>這個指令會將/Users/apple/Documents/code下的所有修改都同步到服務器端,假如這次我只修改了main.文件,可以看到終端打印的信息.```javaSending wenhang/zwy/main.mTransmitting data .Committed revision2.```注:`recision2`中 數字2表示的是提交 svn 項目版本的標識數**
4.** 更新服務器端的代碼到本地客戶端剛才在步驟3中其實已經提到過了,很簡單的一步.首先在終端定位到客戶端代碼目錄后,然后再輸入指令: `svn update` 縮寫:(svn up)**
5.** 更多命令,可以在終端輸入 svn help 查看> 注: 系統自帶的 SVN 無法支持本地刪除文件的更新,即當本地刪除文件后去更新服務器的文件時,刪除的文件又從服務器上拖拽到本地文件中, 但是其支持文件修改后的操作更新操作.###svn 操作解析**1、往版本庫中添加新的文件**`svn add file`例如:svn add test.m(添加test.m)svn add *.m(添加當前目錄下所有的.m文件)svn add xxx@2x.png 文件時, 正常命令 svn add xxx@2x.png 會報 xxx not found需用 svn add xxx@2x.png@ 來添加,也就是圖片名字后面再添加一個@ 符號,這是因為 svn 命令最后需要用@符號來指定一個版本導致的遇到 xxx@2x.png文件時,如果用svn命令行添加到 版本庫的話,只能手動一個一個添加,不能批量添加**2、加鎖/解鎖**`svn lock -m “LockMessage“ [--force] PATH`例如:`svn lock -m “lock test file“ test.m`svn unlock PATH**3、更新到某個版本**`svn update -r m path`例如:svn update如果后面沒有目錄,默認將當前目錄以及子目錄下的所有文件都更新到最新版本。`svn update -r200test.m`(將版本庫中的文件test.m還原到版本200)svn update test.m(更新,于版本庫同步。如果在提交的時候提示過期的話,是因為沖突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)簡寫:svn up**4、查看文件或者目錄狀態**(如下狀態在 Xcode 中會體現,相信大多數的 iOS 開發者都見過的)1)`svn status path`(目錄下的文件和子目錄的狀態,正常狀態不顯示)【?:不在svn的控制中;M:內容被修改;C:發生沖突;A:預定加入到版本庫;K:被鎖定】2)`svn status -v path`(顯示文件和子目錄狀態)第一列保持相同,第二列顯示工作版本號,第三和第四列顯示最后一次修改的版本號和修改人。>注:svn status、svn diff和 svn revert這三條命令在沒有網絡的情況下也可以執行的,原因是svn在本地的.svn中保留了本地版本的原始拷貝。簡寫:svn st**5、刪除文件**`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)**
6、查看日志**`svn log path`例如:`svn log test.m`顯示這個文件的所有修改記錄,及其版本號的變化**
7、查看文件詳細信息**`svn info path`例如:`svn info test.m`**
8、比較差異**`svn diff path`(將修改的文件與基礎版本比較)例如:`svn diff test.m``svn diff -r m:n path`(對版本m和版本n比較差異)例如:`svn diff -r200:201test.m`簡寫:svn di**
9、將兩個版本之間的差異合并到當前文件**`svn merge -r m:n path`例如:`svn merge -r200:205test.m`(將版本200與205之間的差異合并到當前文件,但是一般都會產生沖突,需要處理一下)**
10、版本庫下的文件和目錄列表**`svn list path`顯示path目錄下的所有屬于版本庫的文件和目錄簡寫:svn ls**
11、創建納入版本控制下的新目錄**`svn mkdir`: 創建納入版本控制下的新目錄。用法:1、`mkdir PATH…`2、mkdir URL…創建版本控制的目錄。 -1)每一個以工作副本 PATH 指定的目錄,都會創建在本地端,并且加入新增調度,以待下一次的提交。 -2)每個以URL指定的目錄,都會透過立即提交于倉庫中創建。在這兩個情況下,所有的中間目錄都必須事先存在。**
12、恢復本地修改**svn revert: 恢復原始未改變的工作副本文件 (恢復大部份的本地修改)。revert:用法: revert PATH…注意: 本子命令不會存取網絡,并且會解除沖突的狀況。但是它不會恢復被刪除的目錄**
13、代碼庫URL變更**svnswitch(sw): 更新工作副本至不同的URL。用法: 1、switchURL [PATH]2、switch–relocate FROM TO [PATH...] - 1)更新你的工作副本,映射到一個新的URL,其行為跟“svn update”很像,也會將服務器上文件與本地文件合并。這是將工作副本對應到同一倉庫中某個分支或者標記的方法。 - 2)改寫工作副本的URL元數據,以反映單純的URL上的改變。當倉庫的根URL變動(比如方案名或是主機名稱變動),但是工作副本仍舊對映到同一倉庫的同一目錄時使用這個命令更新工作副本與倉庫的對應關系。**
14、解決沖突**svn resolved: 移除工作副本的目錄或文件的“沖突”狀態。用法: resolved PATH…注意: 本子命令不會依語法來解決沖突或是移除沖突標記;它只是移除沖突的相關文件,然后讓 PATH 可以再次提交。**
15、輸出指定文件或URL的內容。**svn cat 目標[@版本]…如果指定了版本,將從指定的版本開始查找。svn cat -r PREV filename >filename(PREV 是上一版本,也可以寫具體版本號,這樣輸出結果是可以提交的)**
16、配置忽略文件 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**
17、清理工作拷貝/移除鎖/完成未完成的操作/等等**`svn cleanup path`
###svn 常見報錯`(這才是整理了半天,真正的干貨)
1.svn:Server sent unexpected returnvalue(500Internal Server Error)in response to OPTIONS requestfor'http://svn.moon.ossxp.com/svn/test'錯誤的用戶名檢查登錄的用戶名是否輸入錯誤svn: 服務器發送了意外的返回值(500Internal Server Error),在響應 “OPTIONS” 的請求 “http://svn.moon.ossxp.com/svn/test” 中
2.svn: OPTIONS of 'http://svn.moon.ossxp.com/svn/test': authorization failed: Could not authenticate to server: rejected Basic challenge (http://svn.moon.ossxp.com)錯誤的口令用正確的用戶名/口令登錄svn: 方法 OPTIONS 失敗于 “http://svn.moon.ossxp.com/svn/test”: 認證失敗: Could not authenticate to server: rejected Basic challenge (http://svn.moon.ossxp.com)?
3.svn: Server sent unexpected returnvalue(403Forbidden)in response to OPTIONS requestfor'http://svn.moon.ossxp.com/svn/test'用戶無權限聯系管理員,為用戶分配權限 svn: 服務器發送了意外的返回值(403Forbidden),在響應 “OPTIONS” 的請求 “http://svn.moon.ossxp.com/svn/test” 中?
4.svn: OPTIONS of 'http://www.moon.ossxp.com/svn/test': 200 OK (http://www.moon.ossxp.com)服務器地址錯誤,是普通Web頁面,不支持SVN的 WebDAV 協議確認輸入正確的 SVN 服務地址。可以在瀏覽器中輸入該地址進行確認 svn: 方法 OPTIONS 失敗于 “http://www.moon.ossxp.com/svn/test”: 200 OK (http://www.moon.ossxp.com)?
5.The version of yoursubversion(client)is below 1.5.0, upgrade to 1.5.0 or above. SVN below 1.5.0 can not handle mergeinfo properly. It can mess up our automated merge tracking!是由于客戶端的軟件版本低于1.5.0造成的。服務器端對客戶端軟件版本進行了限制,以免對合并跟蹤破壞。升級本地的Subversion客戶端軟件到1.5.0或以上版本。?
6.svn: This client is too old to work with working copy '.'. You need to get a newer Subversion client, or to downgradethisworking copy. See http://subversion.tigris.org/faq.html#working-copy-format-change for details.安裝了多個版本的SVN客戶端(TSVN,Subclipse,...),且各個客戶端的版本不一致。高版本的SVN客戶端會自動更新本地工作目錄中的 .svn 目錄下的文件格式,導致舊版本的SVN客戶端不能繼續訪問該本地工作目錄將本機安裝的所有的SVN客戶端都更新到同一個大版本,以避免本地工作目錄的格式不一致-svn: 此客戶端對于工作副本 . 太舊。你需要取得更新的 Subversion 客戶端,或者降級工作副本。 參見 http://subversion.tigris.org/faq.html#working-copy-format-change 以獲得更詳細的信息。
7. svn: Working cop-svn: 此客戶端對于工作副本 “.” 太舊。你需要取得更新的 Subversion 客戶端,或者降級工作副本。 參見 http://subversion.tigris.org/faq.html#working-copy-format-change 以獲得更詳細的信息。7.svn: Working copy 'trunk/src' locked svn: run 'svn cleanup' to removelocks(type'svn help cleanup'fordetails)異常操作導致目錄沒有解鎖。一個簡單的重現方法:在 .svn 目錄下創建空的名為 lock 的文件使用命令行 "svn cleanup" 或者類似的“清理”動作刪除鎖定svn: 工作副本“trunk/src”已經鎖定 svn: 運行“svn cleanup”刪除鎖定(輸入“svn help cleanup”得到用法)
8.日志中沒有作者信息: ------------------------------------ r9 |(沒有作者信息)| … ossxp.com anonymous commit test匿名提交導致沒有作者信息檢查版本庫權限控制,禁止匿名提交?
9.正在發送 ... 傳輸文件數據.svn: 提交失敗(細節如下): svn: Commit blocked by pre-commithook(exit code1)with output: 提交說明至少應包含 4 個字符, 或者太簡單了。這是由于用戶提交的提交說明(commit log),太過簡單了。在提交時需要輸入有意義的 commit log。寫有意義的提交說明,或者請求管理員更改版本庫插件
10.增加 Logger.c 傳輸文件數據.svn: 提交失敗(細節如下): svn: Commit blocked by pre-commithook(exit code1)with output: Wide character in print at /opt/svn/svnroot/myrepos/hooks/scripts/check-case-insensitive.pl line 259. 發現文件名大小寫沖突: trunk/src/Logger.c 已經存在于 logger.c管理員設置了對新增文件是否重名(只有大小寫不同)的文件進行檢查。文件名只有大小寫不同,在Windows上進行檢出會造成麻煩不要添加重名(僅大小寫不同)文件增加 src/文件aBc.txt 傳輸文件數據.svn: 提交失敗(細節如下): svn: Commit blocked by pre-commithook(exit code1)with output: Clash: '/trunk/src/文件aBc.txt' '/trunk/src/文件abc.txt'
11.svn: While preparing '/home/jiangxin/tmp/svn.test/trunk/src/README.txt'forcommit svn: Inconsistent line ending style提交的文件已經設置了 svn:eol-style 屬性,但是該文本內的換行符有DOS的換行符CRLF,也有Unix換行符LF,不一致!統一該文本文件內的換行符。Linux 下可以用dos2unix, unix2dos, sed等命令。Windows下可用 UltraEdit 進行轉換。 svn: 當為提交操作準備“/home/jiangxin/tmp/svn.test/trunk/src/README.txt”時 svn: 不一致的行結束樣式12.svn: Failed to add file 'Makefile': an unversioned file of the same name already exists執行更新(svn up)時報錯。因為其他人新增一個文件到服務器,而本地卻存在一個同名文件(未版本控制)先將本地重名文件改名,再執行 "svn up",之后再比較、合并文件。或者執行 "svn up --force"-svn: 增加文件 'Makefile' 失敗: 同名未版本控制的文件已存在 13. Adding src/Makefile svn: Commitfailed(details follow): svn: File '/svn/test/trunk/src/Makefile' already exists 添加新文件,提交時報錯。-svn: 增加文件 'Makefile' 失敗: 同名未版本控制的文件已存在?
13.Adding src/Makefile svn: Commitfailed(details follow): svn: File '/svn/test/trunk/src/Makefile' already exists添加新文件,提交時報錯。因為其他人已經先于我增加了該文件。先執行更新操作("svn up"),再根據提示進行操作:合并/提交...增加 src/Makefile svn: 提交失敗(細節如下): svn: 文件“/svn/test/trunk/src/Makefile”已存在?
14.$ svn up Conflict discovered in 'Makefile'. Select:(p)postpone,(df)diff-full,(e)edit,(mc)mine-conflict,(tc)theirs-conflict,(s)show all options: p C Makefile Updated to revision 5. Summary of conflicts: Text conflicts: 1多人同時編輯同一個文件時,可能會遇到沖突。別人先于我提交,則當我提交時要先更新。更新可能遇到不能自動解決的沖突使用工具進行沖突解決$ svn up 在 “Makefile” 中發現沖突。 選擇:(p)推遲,(df)顯示全部差異,(e)編輯,(mc)我的版本,(tc)他人的版本,(s)顯示全部選項: p C Makefile 更新到版本 5。 沖突概要: 正文沖突:1
?15.svn: Commitfailed(details follow): svn: File 'Makefile' is out of date svn: File not found: transaction '6-d', path '/trunk/src/Makefile'提交的文件已被他人刪除先執行更新操作("svn up"),再根據提示解決該樹沖突:刪除文件或繼續添加...svn: 提交失敗(細節如下): svn: 文件 “Makefile” 已經過時 svn: File not found: transaction '6-c', path '/trunk/src/Makefile'
16.svn: Commitfailed(details follow): svn: File or directory '/trunk/XXX' is out of date;tryupdating svn: resource out of date;tryupdating基于舊版本修改是不允許的先更新("svn update"),再提交 svn: 提交失敗(細節如下): svn: 文件或目錄 “/trunk/XXX” 已經過時;請先更新 svn: resource out of date;tryupdating17.svn: DAV request failed; it's possible that the repository's pre-revprop-change hook either failed or is non-existent svn: At least one property change failed; repository is unchanged svn: Error setting property'log': Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook修改提交說明等操作屬于高風險操作,因為該操作沒有被版本控制,屬于不可恢復的操作。缺省禁止。請聯系管理員,啟用該版本的相關鉤子,允許修改“版本屬性”。參見 管理員鉤子設置svn: DAV 請求失敗;可能是版本庫的 pre-revprop-change 鉤子執行失敗或者不存在 svn: 至少有一個屬性變更失敗;版本庫未改變 svn: 設置屬性 “log” 出錯: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook
作者:Sunny_Fight
鏈接:http://www.lxweimin.com/p/66f085556fb2
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。