介紹好用工具:WinMerge

WinMerge 幾乎是我每天必用的軟體之一,他可以幫我比對我在 Subversion 受控管的檔案差異,也可以幫我比對兩個目錄的檔案差異。最主要來說是用來替換掉 TortoiseSVN 內建的 Diff 工具,因為 TortoiseSVN 內建的 Diff 工具對中文字的顯示有些問題,改用 WinMerge 就會好很多。使用 WinMerge 幾乎不用看手冊就會操作了,而且跟檔案總管也整合的十分的好,比對目錄時只要選取兩個資料夾按右鍵選 WinMerge 就會進行比對了。

檔案比對圖例

File Comparison

目錄比對圖例

Folder Comparison Results

安裝好 WinMerge 後的預設「選項」我是建議修改一下,讓使用的時候比較順暢一些,以下是我習慣的設定:

一般:勾選「自動捲至最初差異」

image

比較:比對空白通常沒什麼意義,且檔案多按了個 Enter 也不需要大驚小怪的,斷行符號也不是挺重要的。

image

編碼頁:我們的程式檔案通常都是 UTF-8 編碼,使用「系統用的編碼頁」在繁體作業系統是 Big5,常會造成無法比對的情況。

image

相關連結

  

此文章由 will 發表於 2008/5/11 下午 11:50:19

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion | 介紹好用工具

標籤: , ,

收藏:

比較 svnadmin dump 與 svnadmin load 的執行效能

前陣子比較了一下使用 svnadmin 指令備份與還原 Subversion Repository 的速度,以供未來備份、還原版本庫時的參考依據。

首先我測試的資料量如下:

  • 目錄大小:315MB ( 最後一版所有檔案的大小總和 )
  • 檔案數量:4,016
  • 目錄數量:360
  • 版本數量:共 756 個 Revisions

備份(匯出)測試

匯出的時候我分別測試了不同的 SVN Repository 資料庫類型,也就是 Berkeley database (BDB) 與 Native filesystem (FSFS),並且採用不同的匯出方式,也就是使用 --incremental ( 以差異增量進行傾印 ) (預設的方式),以及使用了 --deltas (於傾印檔輸出中使用檔案差異),一共四種組合。 

實驗一:FSFS 類型的 SVN Repository 使用 --incremental 匯出 ( 預設 )

執行指令:svnadmin dump xxx --incremental > xxx-incremental.dump

執行時間: 1 分 1 秒

檔案大小:524MB

實驗二:FSFS 類型的 SVN Repository 使用 --deltas 匯出

執行指令:svnadmin dump xxx --deltas > xxx-deltas.dump

執行時間: 3 分 44 秒

檔案大小:246MB

實驗三:BDB 類型的 SVN Repository 使用 --incremental 匯出

執行指令:svnadmin dump xxx --deltas > xxx-deltas.dump

執行時間: 6 分 33秒

檔案大小:524MB

實驗四:BDB 類型的 SVN Repository 使用 --deltas 匯出

執行指令:svnadmin dump xxx --deltas > xxx-deltas.dump

執行時間: 2 分 37 秒

檔案大小:246MB

還原(匯入)測試

匯入的時候我分別測試了用 xxx-incremental.dump 與 xxx-deltas.dump 匯入到不同的 SVN Repository 資料庫類型,也就是 Berkeley database (BDB) 與 Native filesystem (FSFS),一共四種組合。

實驗一:使用 xxx-incremental.dump 匯入 FSFS 類型的 Repository

執行指令:svnadmin load xxx-fsfs-inc < xxx-incremental.dump

執行時間: 6 分 54 秒

版本庫目錄大小:234MB

實驗二:使用 xxx-deltas.dump 匯入 FSFS 類型的 Repository

執行指令:svnadmin load xxx-fsfs-deltas < xxx-deltas.dump

執行時間: 6 分 19 秒

版本庫目錄大小:234MB

實驗三:使用 xxx-incremental.dump 匯入 BDB 類型的 Repository

執行指令:svnadmin load xxx-bdb-inc < xxx-incremental.dump

執行時間: 12 分 32 秒

版本庫目錄大小:590MB

實驗四:使用 xxx-deltas.dump 匯入 BDB 類型的 Repository

執行指令:svnadmin load xxx-bdb-deltas < xxx-deltas.dump

執行時間: 9 分 37 秒

版本庫目錄大小:427MB

結論

一般來說,備份通常都是以防萬一,所以時間比較沒那麼緊迫,而還原的時候當然是逼不得已的,且還原時間要越短越好!若用這個邏輯來思考,並用以上的實驗數據來看,SVN Repository 的資料庫類型選擇用 Native filesystem (FSFS) 比較適合,而備份的時候應當選擇用 --deltas 參數執行匯出工作,相對的備份檔案也比較小。

  

此文章由 will 發表於 2008/5/6 下午 09:09:43

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion

標籤: , ,

收藏:

如何快速刪除 Subversion 專用的隱藏目錄

Subversion 的工作副本(Working Copy)目錄裡都會有隱藏的目錄 .svn 或 _svn,裡面儲存了關於此目錄中所有檔案的版本資訊與變更狀態,有時候我們要將專案複製給其他人時通常都會使用 TortoiseSVN 工具中提供的匯出(Export)的功能將專案相關檔案匯出成一個沒有這些 metadata 的隱藏目錄,但如果有人給你的檔案就是有這些目錄的時候想要一個一個刪除還真的很麻煩,今天就是要講如何快速的刪除這些檔案。

首先,我先講如何用「正規」的方法將專案匯出。匯出時要先用滑鼠右鍵「拖曳」該目錄到本目錄或其他目錄,然後放開後才會出現 SVN Export to here 與 SVN Export all to here 功能,但我想很多人會想問這兩個有什麼不同:

  1. SVN Export to here: 將該目錄最新版本匯出(最後一次 commit 的版本)
  2. SVN Export all to here: 將該目錄中所有檔案匯出(包括最新版的檔案、修訂過的檔案、新增尚未 commit 的檔案)

TortoiseSVN 中提供的匯出(Export)的功能

再來,說明今天要主講的「偏方」,有人寫了個小小的註冊檔(Registry File)可以設定檔案總管在目錄上的右鍵選單多一個 Delete SVN Folders 功能,你只要在目錄上按下右鍵,然後選擇 Delete SVN Folders 就會將該目錄以及所有子目錄下的所有 .svn 目錄給刪除掉。

Screenshot-080418-203144

不過這是個很危險的動作,因為這會將所有修訂的紀錄、版本資訊全部都給刪除掉喔,你最好知道你在做什麼,否則不要亂試。

Jon Galloway 部落格所列的 Registry 只針對 .svn 目錄做刪除而已,我自己小修了一下也可以連同刪除 _svn 目錄,註冊檔內容如下:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="Delete SVN Folders"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /k \"TITLE Removing SVN Folders in %1 && FOR /r \"%1\" %%f IN (.svn _svn) DO RD /s /q \"%%f\" \""
 

你只要將以上的註冊檔內容複製下來,並儲存成 DeleteSVN.reg 檔,在雙擊這個檔就可以安裝完成了。

  

此文章由 will 發表於 2008/4/19 上午 12:04:08

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion

標籤: , ,

收藏:

簡報:Subversion 版本管理與協同作業

這是我去年在公司內部教育訓練時教授 Subversion 時所做的簡報檔,有興趣的可以看看:

 

若您想全銀幕觀看可以點選以下網址:

http://docs.google.com/TeamPresent?docid=dfj7hts2_6g4g5zsdv&skipauth=true

 

  

此文章由 will 發表於 2008/3/1 上午 12:06:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion | 團隊合作

標籤: , ,

收藏:

請勿將某些檔案類型的檔案簽入到 Subversion 版本庫

我們在用 Visual Studio 開發專案的時候,常常都會有人將一些個人的設定檔也簽入到 Subversion 版本庫,例如說:*.suo, *.user 等。導致每次開啟 Visual Studio 的時候都會變更這些檔案的內容,造成每次簽入變更到資料庫時都會將這些檔案也都簽入,當其他團隊成員在做 SVN Update 時,會造成檔案衝突的問題,對大家來說也是個困擾。

我這裡整理出一些常見的檔案類型,請不要將以下檔案簽入(commit)到 Subversion 版本庫:

如果你已經簽入(commit)到 SVN 版本庫的話,必須用以下步驟將檔案從版本庫中移出,並從下次起忽略這些檔案:

  1. 先備份這些檔案,然後刪除這些檔案
  2. 簽入這些刪除的變更
  3. 將步驟 1 備份的檔案還原
  4. 重新簽入,但這時會看到幾個新的檔案(non-versioned),將這些檔案加入 SVN 的 ignore list ( 如下圖示 )

    重新簽入,但這時會看到幾個新的檔案(non-versioned),將這些檔案加入 SVN 的 ignore list

    加入後檔案會不見,但是卻會出現目錄的名稱,但是 Status 卻是 modified (property change only) 代表此目錄已經加上了 ignore 的屬性,必須要簽入到 SVN 版本庫後才能將此設定 share 給其他團隊成員:

    加入後檔案會不見,但是卻會出現目錄的名稱,但是 Status 卻是 modified (property change only) 代表此目錄已經加上了 ignore 的屬性,必須要簽入到 SVN 版本庫後才能將此設定 share 給其他團隊成員

 

  

此文章由 will 發表於 2008/2/20 上午 12:06:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion | 團隊合作 | 專案管理

標籤: , ,

收藏:

如何用 TortoiseSVN 復原錯誤的簽入動作

在一個開發團隊裡,當有人將錯誤的程式碼簽入(Commit)到 Subversion 儲存庫(Repository)去,的確會造成許多人的麻煩,這時程式開發經理應該就要立即出面,將這類的問題排除。

如果目前最新的版本(Revision)是 9 的話,你可能想要將版本復原到 Revision 8,這時候有兩種方法可以做:

1. 透過 Update to revision.. 將目前的程式碼更新至第 8 版

透過 Update to revision.. 將目前的程式碼更新至第 8 版

但這種作法是錯的!

因為這方法只是將你的工作目錄更新到舊的版本(第 8 版),這時重新所做的修改其實都會失敗,因為當你要 commit 的時候,Subversion 就會告訴你必須先更新(SVN Update)過才能 commit,到時就會發生衝突!

2. 透過 Merge (合併) 將目前的程式碼合併到第 8 版

透過 Merge (合併) 將目前的程式碼合併到第 8 版

這才是正確的作法!

因為這等於是將目前的版本 ( 第 9 版 ) 直接合併到第 8 版去,現有的工作目錄還是處於第 9 版的狀態,只是所有程式碼因為執行合併的關係而變成第 8 版的內容而已,當你 Merge 成功以後,還必須 commit 一次,讓第9版修改後的程式簽入到儲存庫 ( 成為第 10 版 ),這時的第 10 版就會跟原本的第 8 版一模一樣了!此時,再請專案成員做一次 SVN Update 就可以讓大家回復到正確程式碼的狀態了!

而將目前的 Revision 合併回上一個 Revision 的方式如下,以下將以 TortoiseSVN 工具做說明:

  1. 先在工作目錄的根目錄顯選取 SVN Merge 功能

    透過 Merge (合併) 將目前的程式碼合併到第 8 版

    開啟 SVN Merge 對話方塊

  2. 在 From: 的地方選取 "HEAD Revision" ,在 To: 的地方選取 Revision 並設定到你想要還原到的版本編號 ( 此範例是 8 ),最後按下 Merge 按鈕

    在 From: 的地方選取 "HEAD Revision" ,在 To: 的地方選取 Revision 並設定到你想要還原到的版本編號 ( 此範例是 8 ),最後按下 Merge 按鈕

  3. 此時你將會看到在工作目錄下的檔案已經被異動了,最後再執行 SVN Commit 就可以復原成功了!

 

  

此文章由 will 發表於 2008/1/29 上午 12:04:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion

標籤: ,

收藏:

如何將 Visual SourceSafe 資料庫轉到 Subversion

這是我之前用 Visual SourceSafe 時覺得很難用,將 VSS 轉到 Subversion 過程的筆記。雖然可以轉成功,但是 VSS 中的 Log Message 中文部分都會變成亂碼,這應該是無解,不過至少可以把所有原始碼版本移過來,加減用吧!還沒轉到 Subversion 的還是建議趕快轉,用 Visual SourceSafe 真的會瘋掉!

  1. 下載 vss2svn
  2. 解壓縮 "ssphys.exe" 與 "vss2svn.exe" 出來
  3. 執行 "vss2svn.pl -vssdir D:\Will\VSSDatabase"
  4. 你將會取得 vss2svn-dumpfile.txt 檔

    Will備註:由於 Subversion 是用 UTF-8 做為儲存的字碼。但透過 "ssphys.exe" 倒出來的資料檔卻是 Big5 (因為在Traditional Chinese環境執行),再由 vss2svn.pl 轉出來的 dumpfile 卻是從 ISO-8859-1 轉為 UTF-8 的 dumpfile!!! 所以所有的中文字碼都亂掉了!!最底下有我的解決方案。
  5. 到 Subversion 建立一個資料庫(Reository)

    svnadmin create VSSDatabaseSVN
  6. 將版本庫匯入

    svnadmin load VSSDatabaseSVN < vss2svn-dumpfile-utf8.txt

步驟4做完後請用我寫的 c.php (1.65 kb) 這支 PHP 程式轉換 dumpfile !

轉換的指令是:

    php -q c.php > vss2svn-dumpfile-utf8.txt

  

此文章由 will 發表於 2008/1/3 上午 12:01:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion

標籤: , ,

收藏:

如何透過 TortoiseSVN 存取 CodePlex 網站上的專案

CodePlex 是微軟所經營的開放原始碼社群網站,上面有許多很棒的軟體專案,且全部都是 Open Source 的,有心的人可以在上面學到很多東西。

但要此網站的軟體專案的原始碼控管並不支援 Subversion,所以要參與開發或自動下載更新原始碼就變的比較麻煩。

在 CodePlex FAQ 中就有一頁提到如何透過 TortoiseSVN 存取 CodePlex 網站上的專案。

Using TortoiseSVN with CodePlex
http://www.codeplex.com/CodePlex/Wiki/View.aspx?title=Using%20TortoiseSVN%20with%20CodePlex&referringTitle=Source%20control%20clients

如果你已經有安裝 TortoiseSVN 的話只要到 SvnBridge - Use TortoiseSVN with Team Foundation Server 下載這個橋接器就可以「模擬」使用 Subversion 存取 CodePlex 上面的原始碼了。

使用上十分簡單:

1. 先下載 SvnBridge.zip 解壓縮後只有一個檔案叫做 SvnBridge.exe 並開啟執行。

SvnBridge.exe 執行畫面

2. 然後隨便進一個 CodePlex 的專案,點選 Source 頁籤

BlogEngine.NET Source Tab

3. 在此頁的右邊就有 Server URL (也就是版本控管伺服器的網址)請先複製下來。

複製此頁的 Server URL 位址起來

4. 將該網址貼上 SvnBridge.exe 的執行畫面中的 Team Foundation Server 欄位。

5. 按下 Ok 後會出現警示畫面,按下解除封鎖即可。

6. 然後會在畫面右下角的 System Tray 中多一個 Icon 就是安裝設定完成啦!

7. 之後就可以透過 http://localhost:8081/CodePlex專案名稱/ 存取原始碼了!

例如說:BlogEngine 的 Project Name 是 blogengine ,那麼 Subversion Repository 的位址就是:

http://localhost:8081/blogengine

我用 Repository Browser 的畫面就會像這樣:

唯一的缺點就是「慢」.... ^^

  

此文章由 will 發表於 2007/12/26 下午 06:19:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion | Tips

標籤: , ,

收藏:

發現好工具:CommitMonitor

我們在使用 Subversion 做原始碼版本管理的時候,常常要主動去使用 Show Log 檢查到底專案有沒有別人改過什麼,但因為很多人會忘記看 log 就開始拼命寫,導致下班前才在解決衝突的問題!

今天發現一個很棒的工具,叫做 CommitMonitor,網址在 http://tools.tortoisesvn.net/CommitMonitor

這個小工具可以縮在系統匣(System Tray)中,程式本身執行的時候佔的記憶體很小不太會吃系統的資源,且可以定時去 SVN 儲存庫檢查你參與的專案是否有其他人 commit 了新東西進來,如果有就先看一下 Log 再說。

  

此文章由 will 發表於 2007/12/6 上午 01:08:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion

標籤: ,

收藏:

個人的文件檔案版本管理(Subversion)

我們有許多「暫存」的檔案常常亂擺一通,不然就是修修改改的,如果不敢刪除的時候,就會多複製一份起來存到另一個目錄去,等一段時間後檔案就亂七八糟了!

我個人是有將個人的檔案做版本管理的習慣,同一個檔案怎麼修修改改都沒關係,想要抓前天的版本就只要 Show log 一下就可以將前天的版本抓回來了。

以下是我設定 Subversion 的方式,全部都是在 Windows XP 下完成的。

執行環境

必須先安裝 TortoiseSVN 工具

設置 SVN 儲存庫(SVN Repository)

 1. 建立 SVN 儲存庫專用的目錄

    C:\MySVN

2. 建立儲存庫

選取 Native Filesystem (FSFS)

 儲存庫建立完成

 

將個人常用的檔案匯入剛剛建立的 SVN 儲存庫

1. 先將常用的檔案放在一起

2. 首次匯入檔案到剛剛建立的 SVN 儲存庫

透過 "..." 按鈕選取剛剛建立的 SVN 儲存庫目錄, 注意: 目錄名稱是用 file:/// 開頭的網址型態喔!! 

 

3. 刪除所有檔案

4. 從 SVN 儲存庫取出(Checkout)所有檔案

正常的情況下, 應該甚麼都不用改, 直接按下 OK 按鈕即可.

檔案已經取出! 而這些檔案都有一些打勾的綠色圖示!

每次修改後可以將變動的版本重新 Commit 回 SVN 儲存庫

修改後檔案的圖示會變成紅色的驚嘆號

將變更 Commit 到 SVN 儲存庫

寫一些方便自己日後查詢的修訂日誌

設置自動 Commit 批次檔 ( AutoCommit.bat )

@echo off

::■■■■■■■■■■■■■■■■■
::          取得日期時間
::■■■■■■■■■■■■■■■■■

:: Setting environment variables with todoy's date values
for /f "tokens=1-4 delims=-/ " %%i IN ('date /t') DO (
set year=%%i
set month=%%j
set day=%%k
)

for /f "tokens=1-3 delims=:" %%i IN ('time /t') DO (
set hour=%%i
set minute=%%j
)

:for /f "tokens=1 delims= " %%i IN ("%hour%") DO (
:set hour=%%i
:)

set NOW=%year%-%month%-%day% %hour%:%minute%

svn add MyFiles\*.* -q
set LogMessage="Backup on %NOW%"

svn commit -m %LogMessage%

  

此文章由 will 發表於 2007/12/5 下午 05:27:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion | Tips

標籤: ,

收藏: