git submoduleというのがその答えらしい。
たとえば、CakePHPで作ったアプリケーションをgitでバージョン管理していたとする。ある日超便利と噂のプラグインをいずこからプラグインを置くディレクトリにクローンして、大本のリポジトリをpush。このあと他のところでpullするとプラグインがない。
— ゆうなんとか@ね む いさん (@yuu_hara) 7月 6, 2012
これに対する正解のようなものがタイトルのコマンドらしいです。
つかいかた
$ cd /directory/of/your/repository $ git submodule add https://github.com/cakephp/debug_kit.git Plugin/debug_kit
という感じで使うらしい。なぜか時々うまくいかないなお、モジュールを追加したいリポジトリのルートでコマンドを打たないと追加してくれません。
git submodule - みずぴー日記によると、pullした先では
自分のレポジトリをコピーしただけでは、サブモジュールはコピーされません。git submodule initとgit submodule updateをする必要がある。
とのことです。こちらはまだ試してませんが、ひとまずこれでいけそうな気がします。
ちなみにgit submoduleとだけ打つと
$ git submodule d8ft79gy8upio Plugin/debug_kit(2.2.0) ft7ghujikop84 Plugin/hogehoge
という感じに追加したサブモジュールの一覧が見れます*1。
ちなみにこれ、追加するのは簡単ですが、削除するのは手間です。submoduleの削除 - 呆備録によると、
- .gitmodulesを修正
- .git/configを修正
- git rm --cached 削除したいモジュールのディレクトリ
- git commit
という4段階の手続きを踏まされます。実際踏んでみましたが、心の底から「めんどくさい」と思いました。自分の行いのなかったことにするのがめんどくさい、というのはgitはもとよりバージョン管理ツールの精神みたいなものだと思ってますが、いくらなんでもこれは…
*1:ハッシュと一部サブモジュールは架空のものです