Fossil SCM 是一套軟體配置管理 (Software Configuration Management) 系統, 其中包含分散式版次控管 (DVC, Distributed Version Control) 、WikiBug TrackingTechnote 等功能, 可以用來控制及追蹤軟體開發專案, 並且紀錄專案開發歷程, 在協同產品設計實習課程中, 我們除了使用 git、github 與 bitbucket 之外, 將要在區域網路與系上主幹中, 配置每班兩台的 Fossil SCM 實習主機.

Fossil SCM

Fossil Concepts

check-in - 簽入版本: 對所開發的軟體進行改版後, 簽入倉儲的版本, 稱為簽入版本.

repository - 倉儲: 包含開發專案歷程中, 所有簽入版本檔案的資料庫, 稱為倉儲.

建立新倉儲

可以使用 fossil newfossil init

fossil new foo.fossil

or

fossil init foo.fossil

表示建立一個新的倉儲專案, 且倉儲檔案名稱為 foo.fossil, 在 fossil SCM 中建立新專案時, 登入用戶名稱會成為內定的倉儲管理者, 若要指定管理者名稱, 可以附加 -A USERNAME 或 --admin-user USERNAME, 新增的倉儲就會以 USERNAME 作為管理者名稱, 且指定對應的密碼 (有關 fossil 密碼管理), 當使用者在近端以網際模式啟動該倉儲時 (以 fossil ui 指令) fossil SCM 會直接以管理者身份登入, 無需輸入管理者密碼.

由於 fossil SCM 的倉儲格式為 Sqlite3 資料庫檔案, 因此利用 fossil init foo.fossil 建立倉儲後, 可以利用 sqlite3 工具查驗資料庫中的欄位資料.

首先以 sqlite3 工具指令開啟 foo.fossil 資料庫檔案, 進入 sql 指令環境:

sqlite3 foo.fossil

接著以 .schema user 查詢 user 資料表的欄位名稱, 然後直接讀取資料表中 login, pw 與 info 欄位中的資料:

.schema user
select login, pw, info from user;

其中可以發現 fossil SCM 已經使用 SHA1 hash 編碼使用者帳號對應的登入密碼, 但是當使用者 fossil clone 遠端倉儲到近端時, fossil SCM 會自動以明碼設定倉儲原管理者對應的管理密碼, 且在 fossil clone 結束後, 直接顯示在命令列視窗中 .

clone

$ fossil clone http://your_domain_name ~/fossils/yourdb.fossil
$ fossil open ~/fossils/foo.fossil

add a file

$ fossil add yourfile.txt

git 分支流程模型

http://nvie.com/posts/a-successful-git-branching-model/

Fossil SCM concept

https://www.fossil-scm.org/xfer/doc/tip/www/concepts.wiki

Why Fossil SCM?

  1. 單一檔案工具與單一檔案倉儲上的簡單便捷

  2. 版本倉儲 (repository) 可以不在工作目錄 (working directory) 中, 因此使用者可以從同一個版本倉儲, 在不同目錄中, 簽出多個版本的工作空間, 因此具有伺服器版本控制系統 (server vcs) 與分散式版次控制系統 (dvcs) 的彈性與優點.

  3. 開發歷程不可變更 (因為不提供 rebase 功能), 是優點, 也是許多人認為的缺點.

  4. 小團隊更適合使用 Fossil SCM

  5. 內建網際伺服器支援團隊間的協同合作, 不僅內建提供 wiki, blog, issue tracking, 而且可以在近端修改這些工具所管理的內容後, 提交推送到遠端.

缺乏 submodule (而是採 nested path 呈現), rebase 與 code review 整合功能

git to fossil:

cd git-repo
git fast-export --all | fossil import --git new-repo.fossil

fossil to git:

git init new-repo
cd new-repo
fossil export --git ../repo.fossil | git fast-import

fossil 與 git 雙向同步:

Bidirectional Synchronization

Fossil also has the ability to synchronize with a Git repository via repeated imports and/or exports. To do this, it uses marks files to store a record of artifacts which are known by both Git and Fossil to exist at a given point in time.

To illustrate, consider the example of a remote Fossil repository that a user wants to import into a local Git repository. First, the user would clone the remote repository and import it into a new Git repository:

fossil clone /path/to/remote/repo.fossil repo.fossil
mkdir repo
cd repo
fossil open ../repo.fossil
mkdir ../repo.git
cd ../repo.git
git init .
fossil export --git --export-marks ../repo/fossil.marks  \
       ../repo.fossil | git fast-import                  \
       --export-marks=../repo/git.marks

Once the import has completed, the user would need to git checkout trunk. At any point after this, new changes can be imported from the remote Fossil repository:

cd ../repo
fossil pull
cd ../repo.git
fossil export --git --import-marks ../repo/fossil.marks  \
       --export-marks ../repo/fossil.marks               \
       ../repo.fossil | git fast-import                  \
       --import-marks=../repo/git.marks                  \
       --export-marks=../repo/git.marks

Changes in the Git repository can be exported to the Fossil repository and then pushed to the remote:

git fast-export --import-marks=../repo/git.marks                  \
    --export-marks=../repo/git.marks --all | fossil import --git  \
    --incremental --import-marks ../repo/fossil.marks             \
    --export-marks ../repo/fossil.marks ../repo.fossil
cd ../repo
fossil push

Fossil SCM 一般操作

http://www.gaia-gis.it/gaia-sins/about-fossil.html

fossil clone https://www.gaia-gis.it/fossil/librasterlite \ librasterlite.fossil

或者

fossil clone https://user:password@www.gaia-gis.it/fossil/librasterlite \ librasterlite.fossil

  1. 將倉儲內容開啟, 放入工作目錄中
$ mkdir librasterlite
$ cd librasterlite
$ fossil open ../librasterlite.fossil
  1. 對工作目錄中的檔案改版後, 查詢改版情形

fossil status

  1. 選擇編輯器, 提交版本至遠端倉儲後關閉
$ export "EDITOR=vi"
$ fossil commit
$ fossil close
  1. 其他 Fossil SCM 指令: http://fossil-scm.org/index.html/help

Fossil SCM 特色:

  1. Integrated Bug Tracking, Wiki, and Technotes
  2. Built-In Web Interface
  3. Self-Contained
  4. Simple Networking
  5. CGI/SCGI Enabled
  6. Autosync
  7. Robust & Reliable
  8. Free and Open-Source

Fossil (4 MB) 只需要 zlib 與 stunnel (4MB), 就可以充分使用, 但是 git 則需要許多程式庫與套件才能執行 (200 MB)

參考資料

http://www.fredshack.com/docs/fossil.html