|
本帖最后由 zhaozy78 于 2015-06-02 10:43 編輯 引言 網上有這么多介紹 svn 使用的文章,為什么還要寫?因為它們深入不淺出,平鋪不分類,理論不實際,看完也記不住。 本文先介紹基本用法,后進行實例演練。不求大而全,只求熟練常用,自行用 svn help 舉一反三(比如 -r 參數(shù)很多命令都有)。如果你有環(huán)境(別忘了還有服務器),不妨花十分鐘跟著實例走一遍。 簡介一下 svn:一種流行的版本管理工具。基于一個 svn 服務器,開發(fā)人員用各自的電腦安裝 svn 客戶端后,就可以實現(xiàn)代碼托管、版本管理、協(xié)作開發(fā)等功能。Windows 上的 svn 客戶端有著名的 TortoiseSVN,圖形界面非常好用。Linux 眾多發(fā)行版通常默認安裝 svn 命令行客戶端(本文介紹的內容)。當然 Linux 下諸如 Eclipse 工具也有圖形界面的 svn 客戶端插件,同樣非常好用。 歡迎來到 lovickie 的博客 http://www.cnblogs.com/lovickie svn 命令行用法分類概覽(中括號[] 內為可選參數(shù)) 命令中的 PATH 參數(shù)既可是目錄也可是文件。大多數(shù)命令都可省略 PATH,缺省為當前目錄。有些命令可用 URL 代替 PATH。 -r 參數(shù)大多數(shù)命令都有,缺省 -r BASE。 歡迎來到 lovickie 的博客 http://www.cnblogs.com/lovickie 1. 查看 svn help CMD # 查看 svn CMD 的幫助,注意 CMD 不含 -xx 之類的參數(shù)。 svn info PATH # 查看 PATH 路徑的詳細信息(URL、作者、BASE版本號、修改時間) svn log PATH [-v] [-r HEAD/BASE/PREV/版本號] # 查看 PATH 路徑的提交日志,-v 含文件和子文件夾 # -r 指定版本,缺省 -r BASE # HEAD 服務器上的最新版 # BASE 本地更新或提交的最新版 # PREV 前一版,BASE-1 svn cat PATH/URL [-r 版本] # 查看內容,-r 指定版本 svn di PATH [-r 版本A] [-r 版本A:版本B] # di=diff,查看版本A和本地的區(qū)別,或A和B的區(qū)別 svn di PATH/URL -c 版本B # B必須為數(shù)字,查看版本B-1和B的區(qū)別 svn ls PATH [-v] # ls=list,查看納入版本的文件和子文件夾列表,-v 含本地最新提交記錄 svn st PATH [-v] # st=state,查看本地尚未提交的修改,-v 與 svn ls PATH -v 類似 # A 增加,D 刪除,M 修改,R 替換,C 沖突 # I 忽略,? 未納入,! 異常修改,S 切換 2. 管理 svn co URL --username NAME # co=checkout,檢出工作拷貝至本地當前目錄 svn export URL # 導出至本地當前目錄,非工作拷貝,目錄中不含.svn # 若當前目錄有同名文件夾則失敗 svn import PATH URL -m '提交日志' # 將本地目錄 PATH 導入 URL,PATH 不變?yōu)楣ぷ骺截?br> svn sw URL # sw=switch,將本地當前目錄切換為 URL 的工作拷貝 svn lock PATH -m '提交日志' # 鎖定為僅當前用戶可修改 svn unlock PATH # 解鎖,注意不能加 -m 參數(shù) 3. 修改 svn up PATH [-r 版本] # up=update,更新至本地,U 被更新,G 合并 # 若 C 沖突,則沖突文件*會被修改,并新增文件 *.rxxxx和*.r.mine svn ci PATH -m '提交日志' # ci=commit,將本地修改提交至服務器,提交日志也可以用雙引號 svn mkdir PATH # 新建目錄 PATH 并納入版本管理 svn add PATH # 將 PATH 新納入版本管理 svn del(rm) PATH # del=delete,rm=remove,將 PATH 移除版本管理并刪除 svn cp OLDPATH NEWPATH # cp=copy,復制 svn mv OLDPATH NEWPATH # mv=move,移動 svn revert PATH # 撤銷本地修改(但被刪除的目錄無法恢復) svn resolved PATH # 標記沖突已解決(并非解決沖突文件*,而是刪除*.rxxxx和*.r.mine) 4. 設置忽略屬性 svn propset svn:ignore "FILE" PATH # 將 PATH 目錄中的 FILE 設置為忽略 # 多個 FILE 用回車區(qū)分,不能省略 PATH svn propedit svn:ignore PATH # 編輯 PATH 目錄中的忽略列表 # 之前需 export SVN_EDITOR=/usr/bin/vim svn pget svn:ignore # 讀取當前目錄的忽略列表 svn plist # 查看當前目錄的屬性,如果設置了忽略則顯示 svn:ignore 歡迎來到 lovickie 的博客 http://www.cnblogs.com/lovickie svn 命令行使用例子 假設 http://path 為服務器原有目錄。 歡迎來到 lovickie 的博客 http://www.cnblogs.com/lovickie 1. 檢出工作拷貝 path svn co http://path --username lovickie # 檢出工作拷貝至本地當前目錄 cd path # 應 cd path的最子目錄,下同 svn info svn log -v -r HEAD svn ls -v 2. 創(chuàng)建目錄 path/newdir 2.1 創(chuàng)建目錄方法一:直接操作服務器目錄 svn mkdir http://path/newdir -m '創(chuàng)建目錄' # 直接在服務器上創(chuàng)建目錄 cd path svn up . # 更新至本地 2.2 創(chuàng)建目錄方法二:在本地工作拷貝上操作后提交至服務器 cd path svn mkdir newdir # 也可以 mkdir newdir 然后 svn add newdir svn st # 顯示 A newdir svn ci newdir -m '創(chuàng)建目錄' # 提交修改 svn st # 無顯示,因為本地所有修改均已提交 svn st -v # 顯示 A newdir svn log -v -r HEAD # 顯示 A newdir,'創(chuàng)建目錄' 3. 刪除目錄 path/newdir/dir1 3.1 刪除目錄的準備工作:創(chuàng)建目錄 path/newdir/dir1 和 path/newdir/dir1/a.c cd path/newdir mkdir dir1 vim dir1/a.c # 保存退出,下同 svn add dir1 # 顯示 A dir1,A dir1/a.c svn ci -m '創(chuàng)建待刪除目錄dir1和文件a.c' 3.2 刪除目錄方法一:直接操作服務器目錄 svn del http://path/newdir/dir1 -m '刪除dir1' # 直接在服務器上刪除目錄 cd path/newdir svn up # 更新至本地 3.3 刪除目錄方法二 svn rm dir1 svn st # 顯示 D dir1,D dir1/a.c svn ci -m '刪除dir1' # 提交修改 svn st # 無顯示 svn st -v svn log -v -r HEAD svn up # 將刪除目錄信息更新至本地,重要! svn st -v # 顯示 D dir1,D dir1/a.c svn log -v -r HEAD # 顯示 D dir1,D dir1/a.c,'刪除dir1' 3.4 在刪除目錄后 svn up 的作用不僅僅是讓狀態(tài)刷成最新版本,而且能避免“莫名其妙”的提交失敗 cd path/newdir svn mkdir dir2 svn ci -m '新建dir2' pushd dir2 vim b.c svn add b.c svn ci -m '新增b.c' popd svn del dir2 svn ci -m '刪除dir2' # 報錯 svn up svn ci -m '刪除dir2' # 成功提交 4. 復制目錄 path/newdir/dir3,移動目錄 path/newdir/dir4 4.1 復制目錄的準備工作:創(chuàng)建目錄 path/newdir/dir3 和 path/newdir/dir3/c.c cd path/newdir svn mkdir dir3 vim dir3/c.c svn ci -m '創(chuàng)建目錄dir3和文件c.c' 4.2 復制與移動目錄 cd path/newdir svn cp dir3 dir4 # 將 dir3 復制到 dir4 svn mv dir4 dir5 # 失敗,除非先提交,注意 --force 也不行 svn ci -m '復制dir3到dir4' svn mv dir4 dir5 # 成功將 dir4 移動到 dir5 svn del dir5 # 失敗,除非先提交 svn del dir5 --force # 成功刪除 dir5 svn ci -m '變相刪除了dir4' 5. 撤銷本地修改 path/newdir/dir3 5.1 撤銷修改的準備工作:假設 path/newdir/dir3/c.c 已建立并提交 svn ls path/newdir/dir3/c.c 5.2 撤銷文件修改 dir3/c.c cd path/newdir vim dir3/c.c # 隨便做些修改 svn st # 顯示 M dir3/c.c svn revert # 失敗,參數(shù)不完整 svn revert . # 成功,但操作對象是目錄.而非文件dir3/c.c svn st # 仍顯示 M dir3/c.c svn revert dir3/c.c # 成功撤銷修改 dir3/c.c svn st # 無顯示 5.3 撤銷文件刪除 dir3/c.c cd path/newdir rm -f dir3/c.c svn st # 因為未采用 svn rm,顯示 ! dir3/c.c svn revert dir3/c.c # 成功撤銷刪除 dir3/c.c svn st # 無顯示 5.4 撤銷目錄刪除 dir3 cd path/newdir rm -rf dir3 svn st # 顯示 ! dir3 svn revert dir3 # 失敗,刪除目錄無法用 revert 恢復 svn up # 從服務器更新可恢復被刪除的一切目錄和文件 歡迎來到 lovickie 的博客 http://www.cnblogs.com/lovickie 6. 解決沖突 path/newdir/dir3/c.c 6.1 解決沖突的準備工作:假設 path/newdir/dir3/c.c 已建立并提交 svn ls path/newdir/dir3/c.c 6.2 解決別處提交刪除導致的沖突 cd 一個新的本地目錄 # 注意該目錄下不能有 dir3 svn co http://path/newdir/dir3 svn del dir3/c.c svn ci -m '在別處刪除dir3/c.c' cd path/newdir/dir3 vim c.c # 隨便做些修改 svn ci -m '不知道c.c已被別處刪除,嘗試提交對c.c的修改' # 失敗 svn log -v -r HEAD # 顯示 D c.c,'在別處刪除dir3/c.c' svn up svn st # 顯示 ? c.c,即 c.c 未納入版本管理 svn add c.c # 解決沖突:重新添加 c.c,氣死另一位提交者 svn ci -m '喂不要再刪除c.c了' # 若仍失敗說明又有人搶先提交了 6.3 解決別處提交修改導致的沖突 cd 一個新的本地目錄 # 注意該目錄下不能有 dir3 svn co http://path/newdir/dir3 vim dir3/c.c # 修改如下,新增一行:printf ("別處修改\n");
svn info # 顯示版本號2001 cd path/newdir/dir3 svn info # 顯示版本號2000 vim c.c # 修改如下,新增兩行:printf ("本處修改"); printf ("\n");
svn log -v -r HEAD # 顯示 M c.c,'在別處修改dir3/c.c',注意缺省是 -r BASE svn cat c.c -r BASE # 查看 BASE=2000版內容 svn cat c.c -r HEAD # 查看 HEAD=2001版內容 svn di -r BASE:HEAD # 2000:2001,顯示 BASE 與 HEAD 的差別 svn di [-r BASE] # 顯示 BASE=2000版與本地修改的差別 svn di -r HEAD # 顯示 HEAD=2001版與本地修改的差別,如下
svn st # 顯示 ? c.c.r2000,本地更新或提交的最新版BASE # ? c.c.r2001,服務器上的最新版HEAD,printf ("別處修改\n"); # ? c.c.mine,本地修改,printf ("本處修改"); printf ("\n"); # C c.c,沖突文件,若為U更新、G合并則不用解決,c.c 內容如下
svn resolved c.c # 刪除 c.c.*,標記沖突已解決 svn st # 顯示 M c.c svn ci -m '解決c.c的修改沖突' # 生成版本2002 6.4 詳解 svn di PATH -r A:B 或 -r A(B為本地尚未提交)或 -c B(A=B-1)的輸出格式
當 svn di -r BASE:HEAD 時,顯示 --- (工作拷貝),+++ (修訂版 2001)。 “工作拷貝”在上面兩處的含義不同! 歡迎來到 lovickie 的博客 http://www.cnblogs.com/lovickie 7. 加鎖與解鎖 path/newdir/dir3/c.c 7.1 加鎖的準備工作:假設 path/newdir/dir3/c.c 已建立并提交 svn ls path/newdir/dir3/c.c 7.2 加鎖與解鎖 cd path/newdir svn lock dir3/c.c -m '用戶lovickie鎖定c.c' # 加鎖 svn unlock dir3/c.c # 解鎖,加 -m 則失敗 8. 導出與導入 8.1 導出 path/newdir cd 一個新的本地目錄 # 注意該目錄下不能有 newdir svn export http://path/newdir [-r HEAD] # 當前目錄生成的 newdir 中不含.svn,非工作拷貝 8.2 導入 path/newdir/dir6/d.c cd 一個新的本地目錄 mkdir dir6 vim dir6/d.c svn import dir6 http://path/newdir -m '導入dir6中的內容' # 即只導入了 d.c 8.3 導入 path/newdir/dir7 cd 一個新的本地目錄 mkdir dir7 vim dir7/e.c svn import dir7 http://path/newdir/dir7 -m '導入dir7' # 即導入了 dir7 和 dir7/e.c 8.4 檢驗導入結果 cd path/newdir svn up # 顯示 A d.c,A dir7,A dir7/e.c 9 切換工作拷貝 path/newdir/dir8 9.1 切換工作拷貝的準備工作:假設 path/newdir/dir7/e.c 已建立并提交 svn ls path/newdir/dir7/e.c 9.2 切換工作拷貝 cd path/newdir mkdir dir8 vim dir8/f.c svn add dir8 svn ci -m '新建dir8' cd dir8 svn sw http://path/newdir/dir7 # 切換本目錄為 dir7 的工作拷貝 svn ls # 顯示 e.c svn st path/newdir # 顯示 S dir8 9.3 恢復原工作拷貝(不能revert) cd path/newdir rm -rf dir8 svn up svn ls dir8 # 顯示 f.c 歡迎來到 lovickie 的博客 http://www.cnblogs.com/lovickie 10 設置忽略 path/newdir/dir3 10.1 設置忽略的準備工作:假設 path/newdir/dir3 已建立并提交 svn ls path/newdir/dir3 cd path/newdir/dir3 vim a.out vim a.o vim b.obj svn st # 顯示 ? a.out,? a.o,? b.obj 10.2 設置忽略文件 cd path/newdir/dir3 svn propset svn:ignore "a.out > *.o > *.obj" ./ # 注意不能省略最后的./或.,多個忽略文件用回車分隔(>是自動生成的提示符) svn st # 無顯示,表明忽略列表設置成功 export SVN_EDITOR=/usr/bin/vim # 否則無法執(zhí)行 svn propedit svn propedit svn:ignore ./ # 編輯當前目錄的忽略列表,保存退出后生效 svn pget svn:ignore # 讀取當前目錄的忽略列表,顯示 a.out *.o *.obj svn plist # 顯示 svn:ignore 11 合并(svn merge) 該功能太浪,不建議在未完全掌握時使用。 |
|
|