背景
Git では外部ライブラリ(これまた Git で管理されている)を取り込む仕組みとして、 submodule が用意されています。たんなるソースのスナップショットをコピーして置いておくのに比べると、外部ライブラリのバージョンアップに追随できるという利点があります。しかし、 submodule は運用上の問題をいくつか抱えています。
1. git clone した直後に git submodule update をしなくてはならない
リポジトリをクローンしてすぐにコードをいじり始めたくても、余計なひと手間が必要になります。
GUI クライアントの中には、この作業を忘れないように通知してくれるものもあります。
2. 外部ライブラリの URL が固定化してしまう
.gitmodules には submodule の URL が埋め込まれており、ライブラリ側の URL の変更があると追随できなくなります。(正確には、追随するために一つコミットが必要になります。) Web に公開されているオープンソースライブラリの多くは URL を頻繁に変えたりはしませんが、内作のライブラリでは構成変更での取回しの悪さは意外と煩わしいものです。
3. とにかく、なんか仕組みがややこしい
submodule の目的は外部ライブラリの更新をトレースすることであって、プロジェクト本体のソースをいじる人の多くにとっては関心のないものです。このためにユーザー全員に新しい仕組みの使い方を意識してもらうのはオーバーヘッドが大きすぎる気がします。
ちなみに、 Subversion にも svn:externals プロパティという仕組みがありましたが、 Git submoduleと同じような問題があり、使うのがためらわれました。
他の分散型 VCS もいろいろ探索しましたが、結局のところ、 Git の subtree merge ほど素直にやりたいことができる仕組みはありませんでした。