本文來自個人博客 sunyongfeng.com。博客的文章保持更新,此文可能不是最新狀態。
svn - Subversion command line client tool
這裏講SVN命令行客戶端工具如何使用,不涉及SVN服務器如何部署。
創建新分支
svn copy src_url [-r version] dst_url [-m "message"] [--username your_name --password your_password]
如果不帶-r version
,則默認使用src_url的最新版本。version爲數字,版本號。
建議所有含提交功能的命令都要帶-m message
,這樣才能通過log直接明瞭地看出這個版本提交了什麼修訂。
下載代碼
svn checkout url -r version
從服務器倉庫下載代碼到本地,成爲本地工作副本。
升級到新版本
svn update -r version
查看工作副本狀態
svn status
第一列表示文件的狀態:
-
,沒有修訂
-
A
,添加 -
C
,衝突,需要解決衝突狀態,才能正常提交代碼。 -
D
,刪除 -
I
,忽略 -
M
,有修改 -
?
,沒有版本控制,在工作副本添加文件或目錄之後,需要使用svn add your_path
才能加該文件加到版本控制。 -
!
,文件丟失,如果不是使用svn delete
刪除文件或目錄,會產生此狀態。
添加新文件或目錄到版本控制
svn add file1 file2 ...
svn add dir ...
使用Linux命令或在窗口下添加文件或目錄後,需要使用本命令,才能將添加的文件或目錄加入版本控制,svn提交時才能將該文件或目錄提交到服務器。
刪除文件或目錄
svn delete your_path
如果僅僅是手動使用rm命令或窗口下刪除工作副本內的文件或目錄,該刪除並不會記錄svn的狀態。可能會導致提交代碼時,遺漏了刪除文件或目錄。因此建議刪除svn工作副本內的文件或目錄時,使用本命令進行操作。
重命名文件或目錄
svn move src dst
問題:svn move
重命名文件之後,再用svn diff
打patch會發現只能打進刪除文件的補丁,沒有新增文件的內容,目前還不清楚svn move
要如何打patch。例如:
sunnogo@a3e420:~/src/test$ svn status
sunnogo@a3e420:~/src/test$ svn mv my.spec tmp.spec
A tmp.spec
D my.spec
sunnogo@a3e420:~/src/test$ svn status
D my.spec
> moved to tmp.spec
A + tmp.spec
> moved from my.spec
sunnogo@a3e420:~/src/test$ svn diff
Index: my.spec
===================================================================
--- my.spec (revision 11706)
+++ my.spec (working copy)
@@ -1,27 +0,0 @@
-#ʹ����ȷ�������滻�ļ��а����ַ�'X'�ĵط�
-
-Summary: my packages
- 此處省略N行。
-%attr(755,root,root)
-/*
sunnogo@a3e420:~/src/test$
查看工作副本信息
svn info
能夠查看到本工作副本的url、版本等信息。
生成patch
svn diff [file_list]
將工作副本的修訂以patch的形式輸出,常使用svn diff > your_patch.patch
輸出patch。
打某個版本的patch
svn diff -r ver1:ver2 [file_list]
查看某兩個版本中的修訂,如果ver1大於ver2,則所輸出的diff是回退代碼的patch;如果ver2大於ver1,則所輸出的patch是合併代碼的patch。
應用補丁
svn patch your_patch.patch
提交代碼
svn commit [-m message] [file_list]
如果沒有帶文件列表,則把工作副本的所有修訂都提交,如果有帶文件列表,則只提交文件列表中對應文件的修訂。
合併代碼
svn merge -r ver1:ver2 src_url working_copy_path
可將任意版本的任意修訂合併到工作副本中。如果ver1小於ver2,表示合併src_url分支ver1到ver2的修訂到本地工作副本;如果ver1大於ver2,表示回退修訂。
另外也可以操作服務器倉庫,把working_copy_path直接換成目的分支的url即可,但是這種做法比較危險,不建議新手直接使用。
注意,svn merge
後的commit需要user同時擁有源分支和目的分支的權限才能提交。
回退工作副本的修訂
svn revert file1 file2 ...
svn revert -R dir
查看log
svn log [OPTIONS] [FILE_LIST]
會默認輸出所有的log,不實用,需要使用參數過濾才能得到我們想要的內容。
默認只查看工作副本及以前版本的log。
常用參數
-
-l n
,只輸出n個log信息; -
-v
,顯示修訂的文件,默認不顯示; -
-r ver
,顯示特定版本的log; -
-r ver1:ver2
,顯示版本ver1到ver2之間所有提交的log; -
-r {2013-01-01}:{2013-01-11}
,顯示日期間所有提交的log,-r選項的版本號和日期可以混用; -
--diff
,除顯示log信息外,還直接輸出修訂的內容; -
--search
,根據當前輸出的log信息,按關鍵字過濾log,該關鍵字可以匹配輸出信息的任意字符串,比如可匹配到提交者、提交的log信息,如果帶-v
選項還可以匹配到修訂的文件等。 -
--stop-on-copy
,只顯示當前分支的修訂的log,不會回溯源基線分支修訂的log。比如分支branch基於tags分支版本100創建,此時branch分支的svn log會默認顯示tags分支版本100以前所有修訂的log,而如果帶上本選項,則只會顯示branch分支自己修訂的log。
svn版本信息導入execl表
方法來自stackoverflow
Use the following Subversion command to create an xml file out of the repository's log:
svn log -v --xml > repository_log.xml
,還可以根據需求配搭其他的svn log
選項。- Import the xml file into an Excel spreadsheet (not sure if it will work with LibreOffice/OpenOffice).
- You can then save it as a spreadsheet.