submodule を含む Git リポジトリからファイルをエクスポート

  1. git-submodule の使いかた
  2. Git リポジトリからファイルをエクスポートする
  3. submodule を含む Git リポジトリからファイルをエクスポートする

この3点のメモ
Git には submodule という機能があり、あるリポジトリの下に別のリポジトリを置くことができる。

$ cd some-repository
$ git submodule add git://example.com/hoge.git hoge

のようにすると、 some-repository/hoge に git://example.com/hoge.git をクローンすることができ、 some-repository は hoge 以下のファイルを直接管理はしない。
hoge リポジトリは some-repository とは別の独立したリポジトリのような感じになるので、そこ以下で編集したり commit/pull/push など通常のリポジトリと同様に扱える。
一度 submodule add してしまえば hoge リポジトリをいじった後 some-repository 側で特に操作の必要はない。嘘っぽい。 hoge リポジトリをいじった後 some-repository 側で add, commit が必要みたい。
ちなみに別のマシンからこのリポジトリを使うときは、

$ git clone git://example.com/some-repository.git
$ cd some-repository
$ git submodule init
$ git submodule update

とすれば全ての submodule を同期できる。
で、今回 submodule 付きの Git リポジトリからファイルをエクスポートする必要が出てきた。
普通の Git リポジトリであれば、ファイルのエクスポートは

$ git checkout-index -a -f --prefix=/path/to/export-dir/

のようにすることでできる。このとき /path/to/export-dir/ の最後の / を忘れると悲惨なことになるので注意。
submodule 付きのリポジトリの場合、こうするだけでは submodule で管理されているリポジトリはエクスポートしてくれなかった。
なので、各 submodule ディレクトリ以下にコマンドを実行できる git-submodule foreach を使ってすべての submodule リポジトリに対して git-checkout-index を実行する。

$ cd some-repository
$ git submodule foreach 'git checkout-index -a -f --prefix=`pwd | sed -e "s:/path/to/some-repository/:/path/to/export-dir/:g"`/'

これでok