split git またはこぼれたギットに泣かないで
CPANモジュールのdistを分割したい時などにgit repositoryも分割したいということになる。
が、分割先のrepositoryに含まれないファイルのコミットログなどが一緒に分割されてくるとログが肥大すぎていろいろとうざいときに泣かないために。
まあ、基本git filter-branch使いましょうという話です。
サブディレクトリをルートディレクトリとする場合
CPANモジュールだとこういう場合はないはずなので普通はこの方法はとれないけど一応メモ。
repository中の"hogedir"だけを取り出したい場合。
git clone ParentModule/.git SplitModule cd SplitModule git filter-branch --subdirectory-filter hogedir
基本これだけで十分なのだが、 git show commit-id を直接指定すると変更履歴がみれてしまう。別に問題ないんだろうけど以下もやっとくと完全に見れなくなる。
cd ../ git clone SplitModule/.git SplitModuleClean cd SplitModuleClean git gc --prune=now cd ../ rm -rf SplitModule mv SplitModuleClean SplitModule
なんか面倒ですね。多分もっと簡単な方法ある。
特定のファイルを取り除く
CPANモジュールだとこっちの方法になるとおもう。例えば
├── Changes ├── MANIFEST.SKIP ├── Makefile.PL ├── README ├── README.mkdn ├── TODO ├── author │ ├── assets.pl │ └── test-externals.pl ├── lib │ ├── Amon2 │ │ ├── Config │ │ ├── Declare.pm │ │ ├── Plugin │ │ ├── Setup │ │ ├── Trigger.pm │ │ ├── Util.pm │ │ ├── Web │ │ └── Web.pm │ └── Amon2.pm └── script └── amon2-setup.pl
のようなディレクトリ構成のモジュールがあったとして、libの下は lib/Amon2/Setup 以外は消したいとき。
git clone Amon/.git Amon2-Setup git filter-branch --prune-empty --tree-filter '\ rm -f lib/Amon2.pm;\ rm -rf lib/Amon2/Config/;\ rm -f lib/Amon2/Web.pm;\ rm -rf lib/Amon2/Web/;\ rm -rf lib/Amon2/Plugin/;\ rm -f lib/Amon2/Declare.pm;\ rm -f lib/Amon2/Trigger.pm;\ rm -f lib/Amon2/Util.pm\ '
で、関係するコミットログが消えます。こちらもgit showで直接指定すればまだ見れますのでgit gc --prune=nowをcloneした別ディレクトリで実行するとよいです。