工作筆記之-svn 常用技巧及命令總結


                                                                            SVN常用命令集錦

從服務器上下載上傳代碼
svn co 路徑@版本號  :checkout指定的版本號代碼到本地   , co 是checkout的縮寫形式
svn up -r 版本號   升級(回退)本地代碼到指定的svn版本 , up 是update的縮寫形式
svn ci 文件路徑1/文件名1 文件路徑2/文件名2 。。。-m"上傳註釋"     ,-m“註釋也可寫在文件路徑前面 ,”上傳本地文件到svn服務器 (可以一次上傳多個文件)
svn ci .  提交當前目錄下所以修改的文件
svn 帶用戶名和密碼的操作
svn update/up svn_地址 --username=your_name  --password=your_password
svn commit/ci xxx.java -m"xxx" --username=xxx --password=xxx

代碼提交格式樣例:
一個文件
svn ci opp/BluetoothOppObexServerSession.java -m "for SMPCQ00007273,BT can't transfer a file"
多個文件空格隔開
svn ci obex/ClientOperation.java obex/ServerSession.java obex/ClientSession.java -m "for SMPCQ00007273,BT can't transfer a file" 

其他常用
svn info 查看svn信息
svn st 查看修改狀態      顯示:M  路徑   M代表modify修改  st 是status的縮寫
svn st -q 只顯示修改的文件,不顯示不在版本控制下的文件,如?標誌的文件。
svn diff 顯示修改內容
svn diff > patch_name.patch     導出修改修改內容,並保存爲patch形式。
svn export svn代碼路徑  ;下載代碼,不帶版本控制(即不帶 .svn目錄),這樣佔空間小,但是不能和服務器代碼進行比對
svn ci !(test.cp) -m"註釋"  :表示除了test.c的所有代碼都提交
svn up !(test.c) :表示除了test.c的所有代碼都更新

導入patch命令:   保證導出patch和要打patch的代碼版本號一樣,也就是說沒有多次修改
在android目錄下: patch -p0<patch_name.patch

新增加文件提交步驟:
svn add 目錄/文件
svn st
svn ci 目錄/文件 -m“註釋”

多個文件修改後添加命令:
1.svn add dir_name   新添加目錄dir_name
2.svn add *  進入修改目錄,將同一目錄下的未加入版本庫的文件提交到版本庫:
3.svn add * –-force  :添加--force參數,可以一次性全部添加多級目錄下的多個新文件,忽略所添加的某些子目錄已經在包含在版本控制中的錯誤
4.svn revert --depth infinity *   : 恢復當前目錄下的所以本地修改,比如可以恢復之前的add 、delete等操作

分支合併,代碼移植等操作
svn megre 命令格式:
merge [-r N:M ...] SOURCE[@REV] [WCPATH]
svn merge  源目錄 目標目錄   : svn merge  branch/cts trunk   把cts的修改merge 到trunk目錄裏面

例:merge 把SOURCE對應版本號的改動 複製到 當前工作目錄WCPATH ,默認版本號我0:head
進入當前目錄
svn merge -r 7575:7587 http://XXXXX/svn/RealTek/branches/XXX/app/apk

如果出現衝突時選項: P  (postpone)   保持衝突,後面再去處理衝突  (可以通過命令形式解決,也可以通過文本方式處理)
svn st 查看狀態 ,C 表示有衝突的文件
在文本方式上,點擊有衝突的文件,右鍵-》eit confilt
修改完衝突後,點擊衝突文件-》右鍵-》resolved ,解決衝突

如果出現local add, incoming add upon merge問題,通過如下命令可以解決
svn resolve --accept working -R .
svn revert --depth infinity *


svn版本回退操作:
還原某一個svn版本的修改
進入對應目錄:http://xxxxx/svn/trunk/jb/build/tools
1.svn up 升級到最新代碼 (不是必要,須看情況)
2. svn merge -r 9836:9835 http://XXXXX/svn/trunk/jb/build/tools   //還原tools目錄下svn9836的修改
3. svn st
M       buildinfo.sh
4.svn ci buildinfo.sh -m“revert svn 9836”


回退到某個舊版本(比如說當前HEAD(最新的svn版本號)爲6010,而我要恢復到6000版本)
svn update    //更新到最新版本6010
svn merge -r 6010:6000 source_path
svn st
svn ci modify_files_path -m"restore to revision 6000"
merge是比較指定版本的差異,然後把這些差異保存到本地工作空間,而-r後的6010:6000(注意,這個版本的次序很重要。)
是指在svn號6010相對於6000的修改,並把這些修改還原到6000,保存到工作空間。

同理:回滾中間某一段svn的修改:
svn merge -r new_svn_num:old_svn_num source_path


圖形界面操作版本回退
想回退到以前的版本,但是呢在合併完和想回滾這段時間裏又有人提交了,而我有不想回退這部分代碼。
找了一會後,發現有兩個選項可以貌似可以幫助我Revert to this revision 和 Revert changes from this revision
但我不清楚這兩個的區別,故google了一把,得到以下信息
譬如有個文件,有十個版本,假定版本號是1,2,3,4,5,6,7,8,9,10。
Revert to this revision: 如果是在版本6這裏點擊“Revert to this revision”,表示7~10的修改全部作廢,歷史倒退到了版本6那個年代。
Revert changes from this revision:如果是在版本6這裏點擊“Revert changes from this revision”,表示版本6這個歷史事件被抹殺了,只剩下除版本6外的9個歷史事件了。
如果是同時選擇了6,7,8三個歷史時期並點擊“Revert changes from this revision”,表示抹殺6~8這仨歷史時期。
同理,如果同時選擇7~10,然後點擊“Revert changes from this revision”,則效果跟在版本6這裏點擊“Revert to this revision”是一樣的

tortoisesvn 右鍵沒有菜單顯示問題:
服務器SVN版本和桌面tortoisesvn版本不匹配會造成不顯示右鍵菜單
svn --version 查看svn 版本號

SVN提交問題的一些注意事項
1. 提交方式:svn命令方式,tortoiseSVN菜單方式
2. 提交注意事項:
1). 如果修改爲瞭解決多個問題,最好是單獨提交,有利於之後的跟蹤對比
2). 合作修改,提交之前,注意更新svn代碼,再添加自己的修改,避免提交衝突和覆蓋別人的修改,最好在提交後再檢查提交記錄
 
提交註釋要求:
1. add,modify ,delete
2. 解決的問題描述  (重點)
3. 修改人
4. 提交時間(這個可不用,提交界面會顯示)
5. 其他信息(比如針對特定項目的修改說明、patch添加等)
6. 獨立的應用開發,改動較大的情況、根據特點。

參考格式:
1. “Modify for bugID number :problem description , by name ,for project_name request”
  “Modify for problem description by name”
2. “Add patch from who for which problem by name”
3. “Add function/apk : description by name”

代碼修改註釋格式
/*modify/add/delete for bugID number :problem description by  name change_time start */
     代碼修改部分
/*modify/add/delete for bugID number :problem description by  name change_time end */


常見的一些問題集錦:

問題一:
關於在linux中使用svn add添加並上傳文件到svn的時候,*.so *.bin 等文件被忽略的問題:
方法1: 每次添加文件的時候使用如下命令:svn add  --no-ignore  文件夾
方法2:.編輯以下任一文件(linux的svn客戶端的配置文件)
/etc/subversion/config   (針對服務器所有用戶有效)
~/.subversion/config  或者 home/user_name/.subversion/config(對當前用戶有效,會覆蓋上面)
“/etc/subversion/config”這個配置,而不是在上面原有的配置基礎上增加)
將文件中包含“global-ignores = ”的行,取消註釋,並把這個“=”之後的字符全部刪除。要特別注意 global-ignores 前面不要留空格,緊挨着最前面就可以了,否則svn add的時候會出現以下錯誤:
svn: /etc/subversion/config:103: Option expected    。
保存config這個文件(保存文件之後,SVN就立即載入這個配置,然後立即就可以使用了),即可一勞永逸。永遠都不會有漏傳的文件了。
參考:http://www.2cto.com/os/201303/193668.html

問題二:
代碼比對工具beyond compare 忽略帶.svn目錄的方法:
Go to the [Session] menu ->[Session Settings]-> [Name Filters]. From here, you can enter in something generic, like ".svn" into the Exclude folders list.
Side Note on Right Click Excludes: a .\ in front of an item makes the path relative to the base folders.
".svn" will hide all .svn folders anywhere
".\.svn" will only hide .svn folders in the base (but not subfolders)
".\Folder\.svn" will only hide .svn folders inside the Folder subfolder of the base folder.

問題三:
svn更新失敗解決方法 SVN 本地更新時,由於一些操作中斷更新,如磁盤空間不夠,用戶取消。  可能會造成本地文件被鎖定的情況。一般出現這種情況的解決方法:
1、可以使用SVN clean up來清除鎖定。(第一步先處理)
2、如果不是本目錄鎖定,系統提示上一層目錄鎖定,需要到上一層或者根目錄中清除。
3.如果在根目錄下都無法clean的話,一般採取的方法是另外找一個目錄重新CHECKOUT。但有時有時SVN目錄下可能有一些自己本地修改的文件,還未提交到SVN服務器,       這時重新CHECKOUT需要注意本地文件的備份,並且不要強制覆蓋服務器上其它人修改的內容。
4.如果覺得第3種很麻煩,可以考慮這樣的方法。其實SVN加鎖會在.SVN(隱藏文件)中生成一個名字叫lock的文件(無後綴),查找所有的,手工刪除。然後再嘗試更新, 系統可能會提示某個.base文件無法訪問。找到它,把相關的文件或其所在的目錄刪除,重新UPDATE。工作量就小多了。

問題四:
svn 代碼狀態出現下面問題,及時刪除文件夾,使用svn up 也不能重新升級
local unversioned, incoming add upon update
原因:當工作目錄修改刪除過時更新使用svn更新就容易發生樹衝突“Tree Confilict”.會出現類似提示
解決:
$svn resolve --accept working removed_directory
$svn revert removed_directory  或者 svn revert --depth infinity *
$svn st

問題五:
執行svn up命令,出現如下錯誤:即使刪除文件,重新下載也還是不能解決
Skipped 'configs/my_defconfig' -- Node remains in conflict
解決:使用命令 svn remove --force 目錄/文件  可以解決
svn remove --force my_defconfig
svn up 更新成功

問題六:
怎樣通過命令行獲取android系統的svn號相關
logcat.cpp 中如下語句
version_info_len = snprintf(version_info, 64, "Android Revision: %d\n", ANDROID_VERSION) + 1;
system/core/logcat/Android.mk@中
LOCAL_ANDROID_VERSION := $(shell cd $(LOCAL_PATH) ; if [ -d .svn ] ; then svn info | grep Revision | awk '{ printf("%s", $$2) }' ; else git svn info | grep Revision | awk '{ printf("%s", $$2) }' ; fi)
export SVN_VERSION = $(shell cd $(CURDIR)/../.. ; if [ -d .svn ] ; then svn info | grep "Last Changed Rev" | awk '{ printf("%s", $$4) }' ; else git svn info | grep "Last Changed Rev" | awk '{ printf("%s", $$4) }' ; fi)

在android/system/core/logcat/logcat.cpp中增加語句:則可以通過logcat --svn 獲取當前版本的svn號
#ifdef ANDROID_VERSION
 if (argc == 2 && 0 == strcmp(argv[1], "--svn")) {
     printf("build project svn version = %d \n",ANDROID_VERSION);
     exit(0);
    } 
#endif

附svn 命令自帶幫助信息svn --help  或者 svn command_name --help (例:svn checkout --help)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章