打包备份svn修改
使用svn開發(fā)項(xiàng)目時,有時由于某種原因,我們不能及時地向svn上提交東西。
為了防止本地機(jī)器硬盤掛掉使這些修改丟掉或者想記錄某個時間點(diǎn)的修改,我們有必要對這些修改(Modify,Add狀態(tài))進(jìn)行額外的備份。
下面通過組合幾個工具,寫了個bat腳本來簡化這個過程。整個工具包從這里下載:svnModifyBackup
@echo off
set SVN_DEV_PATH="..\.."
set PRE_TEXTOR=".\PreTextor.exe"
set BAK_FOLDER=".\Backup"
set RAR_PATH=".\Rar.exe"
svn status %SVN_DEV_PATH% | findstr "^M" > code.lst
svn status %SVN_DEV_PATH% | findstr "^A" >> code.lst
%PRE_TEXTOR% code.lst
md %BAK_FOLDER%
%RAR_PATH% a -agYYYY-MM-DD_HH-MM-SS %BAK_FOLDER%\src @code.lst
pause
這段腳本中包含一個PreTextor.exe(自己寫的一個命令行小工具),是用來將svn輸出的code.lst內(nèi)容,修改為rar.exe需要的文件列表
安裝TortoiseSVN時,也裝上相應(yīng)的命令行工具(默認(rèn)會添加svn路徑添加到PATH)
rar.exe為WinRar的命令行工具(詳細(xì)用法可通過rar.exe /?來查看)
特性:
1.?rar壓縮包名的后綴為當(dāng)前備份的時間(到秒),防止相互覆蓋,如下圖所示:
2. 生成rar壓縮包會保留文件的目錄結(jié)構(gòu)(解壓后,方便使用Beyond Compare等比對工具合并修改)
++++++++++++++++++++++++++++++++++++
TortoiseSVN為封裝svn命令行的GUI工具,在其About對話框中,有其版本號與svn版本號說明,如下圖:
TortoiseProc.exe /command:about? // 彈出About對話框
TortoiseProc.exe /command:update /path:"G:\svn\TGameClient"? // 打開TortoiseProc.exe并開始更新G:\svn\TGameClient目錄
TortoiseProc.exe /command:commit /path:"G:\svn\TGameClient"?// 打開TortoiseProc.exe并顯示G:\svn\TGameClient目錄下提交對話框
TortoiseProc.exe /command:log /path:"G:\svn\TGameClient"?// 打開TortoiseProc.exe并顯示G:\svn\TGameClient目錄的日志對話框
TortoiseProc.exe /command:log /path:"G:\svn\toys.upk"? //?打開TortoiseProc.exe并顯示G:\svn\toys.upk文件的日志對話框
更多TortoiseSVN命令詳見:https://tortoisesvn.net/docs/nightly/TortoiseSVN_zh_CN/tsvn-automation.html
++++++++++++++++++++++++++++++++++++
svn常用命令:
svn --help? // 查看svn命令幫助
svn info --help // 查看svn info命令幫助
svn info TRUNK_URL? //?獲取TRUNK_URL庫的最新信息,如當(dāng)前版本號
svn info // 獲取當(dāng)前目錄的本地信息,如TRUNK_URL路徑、本地當(dāng)前svn版本號
svn info main.c // 獲取當(dāng)前目錄下main.c的本地版本信息,如TRUNK_URL路徑、本地當(dāng)前svn版本號
svn list // 查看當(dāng)前服務(wù)器下該目錄文件信息
svn list -v? // 詳細(xì)模式查看當(dāng)前服務(wù)器下該目錄文件信息
svn list -v -R //?詳細(xì)模式查看當(dāng)前服務(wù)器下該目錄(遞歸子目錄)文件信息
svn copy TRUNK_URL BRANCH_URL –m "Create branch from trunk 1665" ?// 從TRUNK_URL的基線號1665,創(chuàng)建一個分支到BRANCH_URL
svn co TRUNK_URL? // 將TRUNK_URL最新版本檢出到當(dāng)前目錄
svn co --username chen --password test?--no-auth-cache TRUNK_URL??// 使用用戶名為chen密碼為test的賬號(不緩存該用戶信息)將TRUNK_URL最新版本檢出到當(dāng)前目錄
svn co TRUNK_URL@1665? PATH --force??// 將TRUNK_URL的基線號1665版本檢出到PATH路徑下(若PATH路徑存在則強(qiáng)制覆蓋)
svn export TRUNK_URL??// 將TRUNK_URL最新版本導(dǎo)出到當(dāng)前目錄
svn?export --username chen --password test?--no-auth-cache TRUNK_URL??// 使用用戶名為chen密碼為test的賬號(不緩存該用戶信息)將TRUNK_URL最新版本導(dǎo)出到當(dāng)前目錄
svn?export TRUNK_URL@1665? PATH --force??// 將TRUNK_URL的基線號1665版本導(dǎo)出到PATH路徑下(若PATH路徑存在則強(qiáng)制覆蓋)
svn sw BRANCH_URL?// 將當(dāng)前svn切到BRANCH_URL分支
svn?sw --username chen --password test?--no-auth-cache?BRANCH_URL ?// 使用用戶名為chen密碼為test的賬號(不緩存該用戶信息)將當(dāng)前svn切到BRANCH_URL分支
svn ci –m "comments"??// 提交當(dāng)前目錄內(nèi)的修改(遞歸子目錄)到svn
svn ci –m "comments"?d:\TestDir??// 提交d:\TestDir目錄內(nèi)的修改(遞歸子目錄)到svn
svn ci –m "comments"?d:\TestDir\Game.exe? // 提交d:\TestDir\Game.exe到svn
svn ci –m "comments"?d:\TestDir\Game.exe e:\scripts\*? // 提交d:\TestDir\Game.exe和e:\scripts目錄下的所有文件到svn
svn add d:\TestDir? // 將d:\TestDir所有目錄和文件(遞歸,除非文件后綴在svn::ignore中)添加本地add狀態(tài)
svn add abc\Test\123.txt?--force --parents // 將當(dāng)前目錄下的abc\Test\123.txt文件及所有父目錄添加本地add狀態(tài)
svn merge TRUNK_URL d:\branch0223??// 將主干最近的改動合并到分支d:\branch0223
svn merge -c 1665 TRUNK_URL d:\branch0223??// 將主干1665改動合并到分支d:\branch0223
svn merge -c 1665 TRUNK_URL\test.txt?d:\branch0223\test.txt ?// 將主干的test.txt文件的1665改動合并到d:\branch0223下的test.txt中
svn merge -r 1665:2015 TRUNK_URL d:\branch0223??// 將主干(1665,2015]改動合并到分支d:\branch0223
-----------------------------------------------------
合并成功后,可以使用一下日志格式和內(nèi)容進(jìn)行提交
Merged revision(s) 1665:2015 from game_proj/trunk/MyGame/Src:
半靈狀態(tài)加個時間顯示
........
-----------------------------------------------------
svn --reintegrate merge BRANCH_URL d:\trunk? // 將分支的改動合并到主干d:\trunk
svn merge -r 801897:801046?d:\TestDir\Game.exe? // d:\TestDir\Game.exe從當(dāng)前801897版本回退到801046版本
svn copy TRUNK_URL TRUNK_BRANCH? // 從主干TRUNK_URL拉取分支TRUNK_BRANCH
svn del?main.c??// 刪除本地當(dāng)前目錄下的main.c文件
svn del?TestDir ?// 刪除本地當(dāng)前目錄下的TestDir文件夾
svn del?TRUNK_URL\main.c?–m "comments" // 刪除TRUNK_URL服務(wù)器上的main.c文件
svn mv?TRUNK_URL\main.c?TRUNK_URL\main2.c –m "comments" --force-log? // 將服務(wù)器上的TRUNK_URL\main.c改名為main2.c
svn mv main.c main2.c // 將當(dāng)前目錄下main.c重命名為main2.c
svn up?// 更新當(dāng)前目錄(遞歸子目錄)的svn到最新版本
svn up main.c // 更新main.c文件的svn到最新版本
svn up?d:\TestDir? // 更新d:\TestDir目錄(遞歸子目錄)的svn到最新版本
svn up -r1665 TestDir? // 更新當(dāng)前目錄下的TestDir目錄(不含external遞歸子目錄)的svn版本到1665
svn revert .? // 丟棄當(dāng)前目錄下所有的修改
svn revert main.c? // 丟棄當(dāng)前目錄下main.c文件的修改
svn revert -R .? // 丟棄當(dāng)前目錄下(遞歸子目錄)所有的修改
svn revert -R?d:\TestDir ?// 丟棄d:\TestDir目錄下(遞歸子目錄)所有的修改
svn revert -R TestDir??// 丟棄當(dāng)前目錄TestDir目錄下(遞歸子目錄)所有的修改
svn cleanup // 清理當(dāng)前目錄下本地未完成svn操作的狀態(tài)信息
svn cleanup TestDir // 清理當(dāng)前目錄TestDir目錄下本地未完成svn操作的狀態(tài)信息
svn log // 查看當(dāng)前目錄的歷史修改
svn log main.c //?查看當(dāng)前目錄下main.c的歷史修改
svn log -l 10 -v //查看當(dāng)前目錄下最新10條log,并打印出每次變更的文件列表
svn log -r {2017-03-24}:{2017-03-25} //查看當(dāng)前目錄下從 [ 2017-03-24, 2017-03-25 ) 之間的記錄,要是時間反過來寫就是先打印2017-03-25的
svn log -r "{2018-04-20 15:00:00}:{2018-04-20 17:00:00}"?//查看當(dāng)前目錄下從 [ 2018-04-20 15:00:00, 2018-04-20 17:00:00 ) 之間的記錄
svn log -r 1665 d:\TestDir?//查看d:\TestDir目錄下版本號為1665的log信息
svn log -r --xml 1665:2015 //以xml形式查看版本號為 [ 1665, 2015 ] 的log信息
svn propset svn:executable on KE.sh? // 為當(dāng)前目錄下的KE.sh增加可執(zhí)行屬性(Unix/Linux/MacOSX等)
svn propset svn:needs-lock on d:\TestDir\*? // 為d:\TestDir下所有文件增加加鎖屬性
svn propset svn:externals "WebUI http://xxx/trunk/Game/WebUI" . // 在當(dāng)前目錄下創(chuàng)建一個externals的外鏈:新建WebUI目錄并將其指向http://xxx/trunk/Game/WebUI
svn propset svn:externals -F externals.txt . // 使用externals.txt文件中externals配置來在當(dāng)前目錄下創(chuàng)建多個外鏈
========== externals.txt ============
WebUI?http://xxx/trunk/Game/WebUI
Content http://xxx/trunk/Game/Content
svn propset svn:ignore "*.pdb *.ncb *.suo" Src??// 為當(dāng)前目錄下的Src目錄增加.pdb .ncb .suo后綴名過濾屬性(在當(dāng)前目錄下點(diǎn)擊Add獲得列表中將過濾掉.pdb .ncb .suo后綴名的文件;但可以通過直接選擇目標(biāo)文件Add)
svn propedit svn:ignore "*.pdb *.ncb" Src??// 為當(dāng)前目錄下的Src目錄過濾屬性修改為.pdb .ncb后綴名(必須要先通過svn propset創(chuàng)建svn:ignore屬性才行使用svn propedit進(jìn)行編輯)
svn propset svn:ignore '*' spool // 忽略當(dāng)前目錄下的spool目錄中的所有文件(Add列表文件列表中不顯示)
svn propset svn:ignore 'images'??// 忽略當(dāng)前目錄下的images文件夾(Add列表文件列表中不顯示)
svn propset svn:keywords "Author Date Revision" test3.txt??// 為test3.txt設(shè)置Author Date Revision關(guān)鍵字
注:在test3.txt中的$Author$、$Date$、$Revision$將被替換成如下內(nèi)容
$Author: chen $
$Date: 2018-07-19 16:36:46 +0800 (周四, 19 七月 2018) $
$Revision: 775107 $
++++++++++++++++++++++++++++++
$Date$ 提交的日期
$Revision$ 提交的版本號
$Author$ 提交的作者
$HeadURL$ 此文件在版本庫中的 URL
$Id$ 上述四個關(guān)鍵字的壓縮組合
svn propdel svn:executable KE.sh? // 刪除KE.sh上的可執(zhí)行屬性(Unix/Linux/MacOSX等)
svn proplist KE.sh?// 查看KE.sh的屬性
svn propget svn:externals -R // 查看當(dāng)前目錄下(遞歸子目錄)所有具有svn:externals屬性的目錄
svn st [-v] ? //?查看本地文件狀態(tài),可以看到當(dāng)前目錄下所有的改動
-v: 可以顯示所有的文件信息,包括未修改的。
-u: 可以用”*”標(biāo)識有更新的文件
文件狀態(tài):
? scratch.c (不在版本控制中)
A stuff/loot (新加文件,未提交)
A stuff/loot/new.c
D stuff/old.c (刪除文件,未提交)
M bar.c (修改文件,未提交)
C cc.c (有沖突未解決的)
svn lock ATD8-Test_Main.udk? // 鎖定當(dāng)前目錄下的ATD8-Test_Main.udk文件
svn lock -m "adjust size" --force ATD8-Test_Main.udk? // 強(qiáng)制鎖定當(dāng)前目錄下的ATD8-Test_Main.udk文件(若被其他人鎖定,則偷鎖),并寫上adjust size的日志
svn unlock ATD8-Test_Main.udk? // 解鎖當(dāng)前目錄下的ATD8-Test_Main.udk文件
svn diff?DefaultADGame_2.ini // 查看DefaultADGame_2.ini文件的當(dāng)前修改
===================================================================
--- DefaultADGame_2.ini (revision 773213)
+++ DefaultADGame_2.ini (working copy)
@@ -6631,7 +6631,7 @@
Level1StateCommandListHard=Rush
Level1StateCommandListHard=SwingBlade
Level1StateCommandListHard=Rush
-Level1StateCommandListHard=Garbage
+Level1StateCommandListHard=Idle
Level1StateCommandListHell=Idle
Level1StateCommandListHell=Laser
注:-Level1StateCommandListHard=Garbage??// -表示刪除
? ? ? ?+Level1StateCommandListHard=Idle?// +表示增加
svn diff -c 772500 DefaultADGame_2.ini?// 查看DefaultADGame_2.ini文件772500版本與其上個版本的差異
svn diff -r 772500?DefaultADGame_2.ini?// 查看DefaultADGame_2.ini文件772500版本與當(dāng)前工作目錄版本的差異
svn diff -r 772688:773161 DefaultADGame_2.ini??// 查看DefaultADGame_2.ini的772688與773161版本差異
===================================================================
--- DefaultADGame_2.ini (revision 772688)
+++ DefaultADGame_2.ini (revision 773161)
@@ -6551,7 +6551,7 @@
RushCount=1
LaserIdleDuration=22.0f
FixedLaserStartFireSeconds=2.4f
-FixedLaserStopFireSeconds=1.2f
+FixedLaserStopFireSeconds=1.6f
MovableLasersStartFireSeconds=1.0f
GrenadeCount=5
+++++++++++++++++++++++++++++++++++
svn版本說明:
svn-win32-1.5.4
svn-win32-1.6.16
svn-win32-1.7.13
svn-win32-1.8.10
... ...
各個版本可以從這兒下載:https://sourceforge.net/projects/win32svn/files/
可以使用以下方法來判斷本地svn目錄是用的哪個版本拉取的:
① 若存在.svn\entries文件,則讀取其中記錄的版本號;不存在則讀取.svn\format文件中記錄的版本號V
? ? ?注:1.7.4等高版本的svn? 把.svn文件夾只放置到簽出root目錄,子目錄不再有.svn
② 若V = 7,則svn的版本為1.3
? ? 若V = 8,則svn的版本為1.4
? ??若V = 9,則svn的版本為1.5
? ??若V = 10,則svn的版本為1.6
? ??若V = 12,則再執(zhí)行命令sqlite3.exe? .svn\wc.db?"PRAGMA user_version",返回值為R(注:sqlite3.exe可以從這兒下載)
? ? ? ? ? ?(a) 若R = 29,則svn的版本為1.7
? ? ? ? ? ?(b) 若R = 31,則svn的版本為1.8
總結(jié)
- 上一篇: Lvs+keepalived 实现
- 下一篇: SQL语句删除重复记录