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