﻿# CollabNet Subversion Edge 安裝筆記 (4)：自訂版本庫範本

昨天在研究 [CollabNet Subversion Edge](https://subversion.apache.org/) 如何自訂版本庫範本 (Repository Template)，照著介面來設定、查了線上文件，其中有種範本的格式文件都說支援，但我怎樣設定就是不成功，雖然最後找到[官方論壇](https://web.archive.org/web/20200427115107/https://subversion.open.collab.net/ds/viewMessage.do?dsForumId=3&dsMessageId=446278)有解決方法，但不是很方便，我便利用 [WinMerge](http://winmerge.org/) 找出真正無法設定成功的主因，特此筆記一下。

我們每次建立版本庫 (Repository) 時，都要重複的建立基本目錄架構、設定版本庫的 hooks 指令檔，這項任務在 [CollabNet Subversion Edge](https://subversion.apache.org/) 的管理介面就可以用 **自訂版本庫範本** (**Repository Template**) 的方式來完成，對版本庫管理作業來說非常的方便，省去了許多功夫。

如果你已經正確設定 Repository Template 話，在建立版本庫時就會看到以下畫面：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/95385f2e5d685c68a604-image_1417.png)

如果要自訂版本庫，可以參考下圖來建立新的範本：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4c456e9f4dd5b41defe0-image_1418.png)

然而，建立 Repository Template 時是有說明範本檔的格式支援以下三種格式：

-   A valid template file can be formatted as a dump file or a zip archive of a single dump file.
-   Alternatively, it may be a zip archive containing the contents of a repository, in which case the template could also include hook scripts.

如果覺得說明的不夠清楚，可以再到線上文件查詢（含圖），網址如下：  
CollabNet Subversion Edge User Guide > Manage repositories > Create a repository template

-   A repository dump file
-   Zipped archive of a repository dump file
-   Zipped archive of the contents of a repository: this should contain the entire repository (including the db and hooks folders), not just a checkout of some portion of the repository

前兩種格式很簡單，就是把版本庫 dump 出來就可以當成範本來上傳，但這並無法滿足我的需求，我需要的是連 hooks 指令檔都當成範本的一部份，這時必須要選擇用三種格式當成範本才行。

我依照文件說明，把整份 Repository 壓縮起來上傳（如下圖示），建立範本的過程沒有問題，有問題的地方在於建立版本庫的時候，即便我選用了我上傳的範本，建立版本庫後，完全都沒有套用成功！

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/059ffef72769a5ed3994-SNAGHTML499a3989.png)

我得到的錯誤記錄如下：

```
The loading of the dump file or archive into repository 'TestProject' failed.Exception: Type: com.collabnet.svnedge.RepoLoadExceptionStacktrace:com.collabnet.svnedge.console.SvnRepoService.loadDumpFile(SvnRepoService.groovy:933)com.collabnet.svnedge.console.SvnRepoService$loadDumpFile$0.callCurrent(Unknown Source)com.collabnet.svnedge.console.SvnRepoService.loadDumpFile(SvnRepoService.groovy:883)com.collabnet.svnedge.console.SvnRepoService$loadDumpFile.call(Unknown Source)com.collabnet.svnedge.admin.RepoLoadJob.execute(RepoLoadJob.groovy:47)org.quartz.core.JobRunShell.run(JobRunShell.java:199)org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:546)
```

幾經苦惱之下到論壇查詢問題解答，所幸還是讓我找到 [RE: Problem using repository templates](https://web.archive.org/web/20200427115107/https://subversion.open.collab.net/ds/viewMessage.do?dsForumId=3&dsMessageId=446278) 這一篇討論，透過 Hot Backup (Hotcopy) 的方式也可以取得一份完整可用的範本，不過透過備份的方式來取得範本步驟有點繁複，相關說明可參考：Schedule repository backups

我為了釐清真像，選擇用 [WinMerge](http://winmerge.org/) 去比對我自己壓縮的版本與透過 [CollabNet Subversion Edge](https://subversion.apache.org/) 線上執行 Hotcopy 的版本，結果發現，我自己對目錄進行壓縮的檔案裡多了一個檔案，位於 **db\\write-lock**

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/a3afdd6c148097458e26-SNAGHTML49a31373.png)

只要把這個 **write-lock** 檔案從壓縮檔中刪除，就可以順利變成一份在 [CollabNet Subversion Edge](https://subversion.apache.org/) 裡可使用的版本庫範本了！

後來我也發現，原來在 svnadmin 工具裡也有個 hotcopy 指令可用，我只要利用這個指令也可以製造出一份有效的版本庫範本檔案，而透過指令來執行備份也是我認為比較好的方法，相關說明請參考 [svnadmin hotcopy](http://svnbook.red-bean.com/en/1.5/svn.ref.svnadmin.c.hotcopy.html) 文件說明。

**相關連結**

-   [RE: Problem using repository templates](https://web.archive.org/web/20200427115107/https://subversion.open.collab.net/ds/viewMessage.do?dsForumId=3&dsMessageId=446278)
-   Create a repository template
-   Schedule repository backups
-   [svnadmin hotcopy](http://svnbook.red-bean.com/en/1.5/svn.ref.svnadmin.c.hotcopy.html)
