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した別ディレクトリで実行するとよいです。