今やバージョン管理システムの代名詞とも言える存在となったGitですが、すべてのソフトウェアプロジェクトでGitが採用されているわけではありません。
人気の高い組み込みデータベースSQLiteもそのようなプロジェクトの一つで、Gitを使わない理由を説明した記事「Why SQLite Does Not Use Git」を公開しています。
この記事によると、SQLiteはGitの代わりに、SQLiteをサポートするために特別に設計されたFossilを使用しています。なぜGitを使わないか疑問に思われることが多く、その疑問に答えるために文書を作成したとのこと。
SQLiteがGitを使わない理由は以下の通りです。
- Gitは状況把握に適していない: SQLiteで何が起きているのかを知りたいときはタイムラインにアクセスすると、一画面ですべてのブランチの最新の変更の概要を見ることができる。GitHubやGitLabには、それに匹敵するものはない。それに近いのはネットワークだがレンダリングに時間がかかり詳細な情報を提供しない。サードパーティ製のGit用GUIをインストールするのも手間がかかる。
- Gitはチェックインの後継者(子孫)を見つけるのが難しい: Gitは過去にさかのぼることはできるが、未来に進むことはできない。対照的に、Fossilはhttps://sqlite.org/src/timeline?df=major-release、最新のメジャーリリースに由来するすべてのチェックインを表示するなど、便利な表示を提供している。Gitでチェックインの子孫を見つけることは不可能ではないが困難だ。
git rev-list --all --parents | grep " R-20568-61871:[. ] \{40\}.*.*" | awk '{print $1}'
上のコマンドは、何が起きたのかを理解するために重要な分岐構造を表示せずに子孫の一覧を表示する。
- Gitのメンタルモデルは不必要に複雑だ: Gitの複雑さは開発中のソフトウェアから注意をそらす。Gitを使う人は、次のことをすべて頭に入れておく必要がる。
- 作業ディレクトリ
- インデックスまたはステージングエリア
- ローカルヘッド
- リモートヘッドのローカルコピー
- 実際のリモートヘッド
対照的に、Fossilのユーザーは作業ディレクトリと作業中のチェックインについて考えるだけでいい。
- Gitは過去のブランチ名を追跡しない: Gitは、チェックイン・シーケンスの完全なDAGを保持する。しかし、ブランチタグはローカルな情報であり、ブランチが閉じられると同期されず保持されない。このため、過去のブランチを見直すのは面倒な作業となる。Fossilビューは、ブランチが最終的にトランクにマージされたことを明確に示す。
- Gitはより多くの管理サポートを必要とする: Gitは複雑なソフトウェアだ。開発者のワークステーションにGitを置いたり、新しいバージョンのGitにアップグレードしたりするには、何らかのインストーラーが必要。Gitサーバーを立ち上げるのは自明ではないので、ほとんどの開発者はGitHubやGitLabのようなサードパーティーのサービスを使う。対照的に、Fossilは単一のスタンドアロン・バイナリで、$PATHに置くことでインストールされる。このバイナリは、コアのGitとGitHubやGitLabのすべての機能を含んでいる。Wiki、バグ追跡、フォーラムを備えたコミュニティ・サーバーを管理し、消費者向けのパッケージ・ダウンロードやログイン管理などを提供する。
- Gitは貧弱なユーザー体験を提供する: ソフトウェアの設計は難しい。集中力が必要だ。優れたバージョン管理システムは、開発者にフラストレーションを与えるのではなく、援助を与えるべきだ。Gitはこの点で、過去10年の間に良くなってきたがが、まだ先は長い。
Gitのコマンドが複雑な事は確かで、
Fossilがそれほど優れているバージョン管理システムシテムならば実際に使ってみたいと思った開発者の方はも多いかもしれません。
Hacker Newsではこの記事に関する議論が行われていて、例えば、Fossilがバージョン管理システムとしてのコア機能に加え、Wikiやバグ追跡、フォーラム機能などを提供するのがはたして良いことなのかなどさまざまなコメントが寄せられています。