前回Gitで特定フォルダのみクローンする方法を書いたが、これはsubmoduleの場合も使用可能。というか、submoduleの時にこそ使用する機会が多いだろう(dllだけ取るなど)。
ただ、ファイルを置く場所がちょっと異なる。submodule関連の設定は.git/modules
配下にあるため、sparse-checkoutもこちらに置く必要があるのだ。
1.git submodule add https://some/module.git somemodule
2.git commit -m "add module"
3.cd somemodule
4.git config core.sparsecheckout true
5.echo I_want/this_folder/ > ../.git/modules/somemodule/info/sparse-checkout
6.echo need/this_folder_too/ >> ../.git/modules/somemodule/info/sparse-checkout
7.git read-tree -mu HEAD
2のcommitは、この段階でまだコミットが一回もないなら必要。最後のread-tree
でHEADを読むため、一回はcommitしておかないとうまく動かない。
3以降の設定は、サブモジュールのフォルダ内で行う。sparse-checkoutで指定するのも、ルートからではなくサブモジュール内でのパスになる(上記でも、somemodule/I_want/this_folder/とはしていない)。
ポイントは5番で、modules配下にある各モジュールの設定に対しsparse-checkoutを書き込んでいる。追加するパスがさらにある場合は、6番(ファイルへの追記)を繰り返す。
これで、必要な部分だけ使いリポジトリを構成できて一安心。。。と思いきや、この設定(.git
内の設定)はcommitして記録することができないので、チームで共有するということができない。つまり各人が上記のコマンドを打っていく必要があり、サブモジュールが多い場合めげるだろう。
この点についてはうまい方法がないか調査中。