GitからFossilへ
From Git to Fossil (lucio.albenga.es)
要約
Rust言語の採用を強制しようとする動きに反発した著者が、個人プロジェクトのためにGitの代替となるバージョン管理システムを探した結果、Fossilにたどり着いた経緯が語られています。FossilはC言語で書かれており、軽量で自己ホスト型のWebサーバー機能を持つ点が評価されています。記事では、GitリポジトリからFossilへの移行手順と、Fossilサーバーのセットアップ方法についても解説しています。
全文翻訳
/home/lucio.albenga.es
GitからFossilへ
Gitの関係者が、Rust[1]プログラミング言語を必須にする提案に着手したようです。私はRustが好きではなく、とりわけ、何十年も機能してきたプロジェクトを書き換えたり、ソーシャルメディアで組織的な攻撃を行ったり、全体主義的な妄想を持つような小集団にふさわしい他のくだらないことをしたりして、皆にそのゴミを押し付けようとする、一部の過激な連中が作るRustコミュニティが嫌いです。だから、「強制的に」Rustの使用やCからの移行を目指すプロジェクトを見ると、指輪物語のバルログに鞭で追われるかのように、可能な限り逃げ出します。
私は、RCS (Revision Control System)、CVS (Concurrent Version System)、SVN (Subversion)、HG (Mercurial)、BZR (Bazaar)、そして前述のGitなど、多くのバージョン管理システムを使用(またはテスト)してきた経験があります。これは、私が再び切り替えることに抵抗がないことを意味します。そこで、個人的なプロジェクトのためにGitの代替を探し始めました。
選択肢は、以前から知っているシステムに戻るか、何か新しいものを探すかでした。そして、Fossilを思い出しました。ソースコードを調べ、公式ドキュメント[2]を読み、その機能、依存関係、インストールと設定方法などを学び始めました。そして、私が気に入る多くの点があることに気づきました。
- C言語で書かれている(Web機能には一部JavaScriptとTclを使用していますが)こと。小さく効率的なプログラムで、ハードウェアリソースをほとんど消費しません。
- 使い方がシンプルで、より自然に感じられます(少なくともSubversionのような他のシステムを知っている人にとっては)。ステージングエリアのような、Linuxカーネルのような大規模で複雑なプロジェクトには役立つかもしれませんが、私には実用的な使い道のない、過剰な機能が含まれていないからです。
- サーバーを自分で素早く簡単にセルフホストできます。すでにそのように準備されているからです。実際、バージョン管理ビュー、Wiki、チケットなどを持つWebサーバーとWebインターフェースがあります。一方、GitではGitLab、Gitea、Forgejoのような外部ソフトウェアを使用する必要があり、それぞれが少なくとも1つの追加ソフトウェア依存関係となります。
- コミットメッセージはメールアドレスを使用せず、ユーザー名を使用します。そのため、公開リポジトリがあってもスパムを心配する必要がなく、この用途のためだけに特定のメールアドレスを用意する必要もありません。
- Gitとの相互運用性があります。つまり、必要に応じてリポジトリをGitに戻すことができ、FossilリポジトリとGitリポジトリ間の双方向同期もサポートしています[3]。これは、FossilとSqliteプロジェクトがGitHubミラーを管理するために使用している機能です。
これらすべてを考慮し、FossilをインストールしてプロジェクトをGitから移行することにしました。以下にその方法を示します。
Fossilのインストール
最初のステップはFossilをインストールすることです。お使いのオペレーティングシステムのパッケージマネージャーにすでに利用可能である可能性が高いです。
sudo apt install fossil # Devuan GNU+Linux
pkg install fossil # FreeBSD
パッケージマネージャーのインストールが終了したら、以下のコマンドで利用可能かどうかを確認できます。
fossil version
上記のコマンドは、次のような結果を返すはずです。
This is fossil version 2.21 [3c53b6364e] 2023-02-26 19:24:24 UTC
Gitリポジトリのインポート
Fossilのドキュメント[4]には、GitリポジトリをエクスポートしてFossilリポジトリとしてインポートするための例が記載されています。
cd repository
git fast-export --all | fossil import --git repository.fossil
私は、インポートされたリポジトリを「正しく」するためにいくつかの調整をしたかったので、少し違う方法で行いました。複数のリポジトリがあるので、2つの異なるフォルダを作成しました。1つはエクスポートされたリポジトリを保存するgit-exported、もう1つは新しいFossilリポジトリを保存するfossilsです。
mkdir ~/git-exported
mkdir ~/fossils
これで、各Gitリポジトリフォルダに入ってエクスポートできます。
cd repository
git fast-export --all > ~/git-exported/repository.export
すべてのGitリポジトリをエクスポートしたら、~/fossilsフォルダに入り、1つずつインポートします。
fossil import --git \
--rename-master trunk \
--attribute "your@mail.com your_username" \
repository.fossil ~/git-exported/repository.export
--rename-master trunkオプションは、Gitのmasterブランチを新しいFossilリポジトリのtrunkにリネームします。Fossilは、Subversionのような他のバージョン管理システムと同様に、マスターブランチの名前としてtrunkを使用します。もし、マスターブランチが「main」という名前になっている不幸な方であれば、このオプションはあなた向けではなく、リネームしたい場合はFossilのドキュメントを確認する必要があります。
--attribute "your@mail.com your_username"オプションは、Gitコミットのメールアドレス「your@mail.com」を、インポートされたFossilコミットでは「your_username」に変更します。Fossilでは、デフォルトのユーザー名は現在使用しているオペレーティングシステムのユーザー名と同じです。明らかに、指定されたメールアドレスは、1つ以上のコミットメッセージに存在する必要があります。
複数のメールアドレスを変更したい場合は、複数の--attributeオプションを使用できます。
fossil import --git \
--rename-master trunk \
--attribute "your@mail.com your_username" \
--attribute "rms@gnu.org rms" \
--attribute "linus@kernel.org torvalds" \
repository.fossil ~/git-exported/repository.export
インポートコマンドの出力は次のようになります。
Rebuilding repository meta-data...
100.0% complete...
Vacuuming... ok
project-id: e64b112b40eb3db188060ddb8deeaa96a6ad3b71
server-id: bfbcd4bf8f0f64eaa2d832ddc3b4af00639624a6
admin-user: your_user (password is "XAxPVZcNQ6")
注意深く見ると、出力にはリポジトリ管理者のユーザー名とパスワードが表示されます。これらはリポジトリで特定の操作を行う際に必要になるため、保管しておいてください。
Fossilサーバーの設定
Fossilには組み込みのWebサーバーがあるため、これを利用してセルフホストサーバーを素早く簡単に作成できます。以下の方法は、外部からアクセスできないプライベートネットワーク上の、ユーザー数の少ないシステムには十分です。Fossilサーバーの設定方法にはいくつかあり、ニーズに応じて最適な方法が異なりますので、公式ドキュメントを参照することをお勧めします。
まず、サーバー上にFossilリポジトリを保存するためのフォルダを作成する必要があります。
mkdir /path/to/your/fossils
次に、Fossilリポジトリをサーバー上のフォルダにコピーします。
scp *.fossil user@your_server:/path/to/your/fossils/
これで、以下のコマンドでサーバーを起動できます。
fossil server --port 8043 \
--cert /path/to/your_cert.pem \
--pkey /path/to/cert/key.pem \
--repolist /path/to/your/fossils/
有効な証明書がない場合は、以下のコマンドを使用できます。
fossil server --port 8043 \
--cert unsafe-builtin \
--repolist /path/to/your/fossils/
サーバーが実行されたら、ブラウザで https://server_address_or_hostname:8043/ というURLを入力すると、リポジトリ一覧のWebページにアクセスできます。一覧にあるリポジトリのいずれかをクリックすると、リポジトリのWebページが表示されます。ナビゲーションメニューに「ログイン」オプションが表示されるはずです。それをクリックし、リポジトリ管理者のユーザー名とパスワードを使用します。これで、リポジトリをお好みに合わせて設定できます。詳細については、Fossilのドキュメントをご覧ください。
Fossilリポジトリ管理者のパスワードを紛失した場合は、以下の手順で復旧できます。
-
サーバー上のリポジトリフォルダに移動します。
-
Sqliteがインストールされていない場合は、お使いのオペレーティングシステムの標準的な方法でインストールします。
-
repository.fossilをSqliteで開きます。
sqlite3 repository.fossil -
sqlite内で、以下のクエリを実行します。
select login,pw from user;上記のクエリは、次のような結果を返します。
your_user|My3w2jRxt1 anonymous|57EBCBD1AAE663B4 nobody| developer| reader|パスワードは、2番目の列の値です(この例では文字列My3w2jRxt1)。
-
以下のコマンドでSqliteを終了します。
.quit
Fossilの使用
ここでは、Fossilを使い始めるための非常に簡単なガイドを示します。このガイドは、Gitの基本的な使い方を知っていることを前提としており、あくまで出発点です。そのため、FossilのドキュメントとFossil Book[5]を読むことをお勧めします。
ヘルプの取得
ヘルプコマンドは、利用可能なコマンドと各コマンドの使用法およびオプションを確認するために不可欠です。ヘルプコマンドはGitと同様に機能します。
fossil --help
fossil command_name --help
リポジトリの作成とクローン
これらはGitと似ていますが、違いがあります。Gitでは、リポジトリが現在の作業フォルダと一致することが一般的です。Fossilではそうではなく、リポジトリ(ファイルrepository.fossil)と作業(チェックアウト)フォルダ(repository_folder)の間に明確な分離があります。
リポジトリの作成
新しいリポジトリは、以下のコマンドで作成できます。
fossil init repository.fossil
このコマンドはリポジトリ、つまりrepository.fossilファイルのみを作成します。作業を開始するには、それを「開く」必要があります。フォルダを作成し、その中に移動して、リポジトリを開きます。
mkdir my_working_folder
cd my_working_folder
fossil open /path/to/repository.fossil
作業フォルダの名前をFossilに指定することもでき、存在しない場合はFossilが作成を試みます。
fossil open --workdir my_working_folder /path/to/repository.fossil
リポジトリのクローン
fossil cloneコマンドにリポジトリのURLを続けて使用することで、リポジトリをクローンできます。URLはWeb URL、SSH URL、ファイルパスなどです。
fossil clone https://host/repository
このコマンドは自動的にrepository.fossilファイルをダウンロードし、同じレベルに作業フォルダrepository_folderを作成します。作業フォルダを作成したくない場合は、以下のコマンドのように使用できます。
fossil clone --no-open https://host/repository
リポジトリがクローンされた後、リモートリポジトリにコミットを送信したい場合(権限がある場合)、作業フォルダ内でリモートFossilリポジトリを設定する必要があります。
fossil remote https://user@host/repository
上記のコマンドは、ユーザーのパスワードを尋ね、将来の使用のために保存するかどうかを尋ねます。
ヒント: Fossilはリポジトリファイルと作業フォルダを明確に分離しているため、私はすべての.fossilファイルを/home内のfossilsという名前のフォルダに保管し、作業フォルダは各ケースで最も適切な場所に置いています。
情報の取得
作業フォルダとリポジトリのステータスに関する情報を取得するには、Gitとはいくつかの違いがあります。特にコマンドの名前と使用法が異なります。
タイムラインの表示
Fossilでは、fossil timeとfossil timelineコマンドがGitのgit logコマンドに相当します。以下に、情報量が少ないものから多いものまでの例を示します。
fossil time --oneline # git log --oneline に似ている
fossil time
fossil time --medium
fossil time --verbose # git log に似ている
作業フォルダ内の変更の表示
バージョン管理下にないファイルやフォルダを表示するには:
fossil extras
バージョン管理下にあり、変更されたファイルを表示するには:
fossil changes
上記の2つのコマンドの組み合わせを表示するには:
fossil changes --differ
Gitのgit statusコマンドの出力に似た方法で、作業フォルダとリポジトリのステータスを表示するには:
fossil status --differ
Diff(差分)の表示
作業フォルダ内のファイルの内容とリポジトリ内の内容との差分を表示するために、FossilはGitと同様にdiffコマンドを持っています。
fossil diff
特定のコミットと作業フォルダとの差分を表示するには:
fossil diff --from 2c26dd6b69 # 2c26dd6b69 はコミットのハッシュ値
2つの特定のコミット間の差分を表示するには:
fossil diff --from 2c26dd6b69 --to cd086a1045
Fossilのdiffコマンドは色付きのdiffを表示しません。色付きのdiffが必要な場合は、Wikiを参照してください[6]。
変更の取得
Fossilにはautosyncというオプションがあり、デフォルトで有効になっています。このオプションは、ローカルリポジトリをリモートリポジトリと同期させ続けます。autosyncオプションが有効になっている場合、以下のコマンドでリモートリポジトリからのすべての変更を取得できます(変更がある場合)。
fossil update
そうでない場合は、Gitに近くなります。まずpullを実行して変更を取得し、次にupdateを実行して作業フォルダに反映させる必要があります。
fossil pull
fossil update
変更のコミット
Fossilにはステージングエリアがないため、コミットはSubversionのようなバージョン管理システムに非常に似ています。Gitよりも。
保留中のすべての変更をコミットしたい場合:
fossil commit
上記のコマンドは、コミットメッセージを入力するためのエディタを開きますが、オプションとしてコミットメッセージを指定することもできます。
fossil commit -m "My commit message"
特定のファイルをコミットできます。
fossil commit file1 file2
fossil commit file1 file2 -m "My commit message"
autosyncオプションが有効になっている場合、commitコマンドは変更をリモートサーバーにも送信します(リモートサーバーがある場合)。そうでない場合は、以下のコマンドで変更をリモートサーバーに送信する必要があります。
fossil push
ファイルの追加と削除
新しいファイルをバージョン管理下に置く必要がある場合は、以下のコマンドで行えます。
fossil add filename
バージョン管理からファイルを削除するには、以下のコマンドで行えます。
fossil delete filename
fossil rm filename
デフォルトでは、rmとdeleteコマンドはファイルをファイルシステムから物理的に削除せず、単にバージョン管理下にないものとしてマークするだけです。
fossil addremoveというコマンドもあり、これは作業フォルダ内のバージョン管理下にないすべてのファイルを作業フォルダに追加し、バージョン管理下にあるが作業フォルダに存在しなくなったすべてのファイルをリポジトリから削除します。
ファイルの無視
設定は、FossilとGitの間にいくつかの重要な違いがある点の1つです。そのため、Fossilのドキュメントを参照することをお勧めします。ファイルやフォルダを無視するには、作業フォルダ内に.fossil-settings/ignore-globというファイルを作成する必要があります。
cd working_folder/
mkdir .fossil-settings
touch .fossil-settings/ignore-glob
次に、グロブパターン[7]を使用して編集します。
build/
3rdparty/
*.o
*/a.out
ブランチとタグ
Gitのパラダイムはブランチとタグの集中的な使用を奨励しますが、Fossilのパラダイムと機能は異なるため、ワークフローも異なります。
私は個人的なプロジェクトでブランチをあまり使用しないため、違いを理解してFossilの機能をワークフローに適合させたり、ワークフローをFossilの機能に適合させたりするために、以下のFossil Wikiのリンクを読むのが良いでしょう。
ローカルWebインターフェース
Fossilサーバーがない場合でも、Webインターフェースにアクセスして使用できることを明確にしておきたいです。これを行うには、作業フォルダ内で以下のコマンドを実行します。
fossil ui
最終的な考察
私はFossilを非常に気に入っており、私の意見では、Subversionのような集中型バージョン管理システムとGitのような分散型バージョン管理システムとのほぼ完璧な組み合わせです。サーバーモードでのセットアップの容易さ、Webインターフェース、そして何よりも、コマンドラインと一般的なタスクのシンプルさが気に入っています。
特に、セルフホスティングソリューションに関心のあるインディープログラマーや小規模グループにとって、多くのものを提供できる素晴らしいプログラムだと思います。Gitのシンプルで効果的な代替手段を探しているなら、Fossilを検討してみてはいかがでしょうか。それはまさにあなたが探しているものかもしれません。