StoryEdit 開発日誌

ウェブアプリ StoryEditを作ってましたが延期。普通のブログ。

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に感動。やっぱいいね〜。