Gitでサブディレクトリのみをマージする。git filter-branchで。
タイトル通り。あるサブディレクトリだけブランチ間でマージしたい。というとき。
いろいろ方法はあるが、以下の方法をとった。
1. git filter-branchでそのディレクトリだけのリポジトリを作る(切り出し)
2. マージする。
3. パッチを作成する。
4. 元のリポジトリをcloneしてきて、サブディレクトリに移動し、パッチをあてる。
1. git filter-branchでそのディレクトリだけのリポジトリを作る(切り出す)
> cd $proj > ls dir_a dir_b > git filter-branch --subdirectory-filter dir_b --prune-empty --all
これで、サブディレクトリだけ切り出すことができる。
2. マージする。
> git branch * branch1 branch2 > git merge branch2
普通にマージ。
3. パッチを作る
> git diff --cached > patch
mergeされているものとのdiffは--cached で。
4. 元のリポジトリをcloneしてきて、サブディレクトリに移動し、パッチをあてる。
> git clone git@github.com/myrepo.git > cd myrepo > cd dir_2 > patch -p1 < patch
3で作ったパッチは、ディレクトリが一階層ずれてるのだけ注意。git applyはなぜかうまく行かなかったので、普通に当てました。git apply使える人はそれで。
ちなみに、git filter-branchなんて使ったことなかったんだけど、なかなか強力。すべてのコミットにわたって、適用したい動作を投げて、再コミットしてくれる、まさに完全書き換えコマンド。
合わせて、以下の公式ドキュメントもおすすめ。
Git - 歴史の書き換え
予想以上にらくちんにできるgitに感動。やっぱいいね〜。