git subtree split --branch

リポジトリの取り込みにsubtreeを使い始めて、機能的には満足の行くものだと感じた。けれどもsubtree pushする時にどんどん遅くなっていく。これは全履歴をチェックし必要ならば履歴を作り直すからのようだ。subtree splitを使うと特定のコミットをブランチとして切り出せるので、これを使うと作り直しの起点となるコミットを前進させられる……と教えてもらったがダメだった。

$ git remote add -f subtree_origin https://example.com/bob/foo.git
$ git subtree add --prefix=foo/ --squash subtree_origin master
...Commit some changes...
$ git push origin master
$ git subtree split --prefix=foo/ --branch=subtree_branch
$ git push subtree_origin subtree_branch:master

originpushするまでは通常通りで、subtree pushする場合とも同じ。その後、subtree splitsubtree_branchとして切り出し、そのブランチをsubtree_originmasterpushする。subtree_branchは作業ブランチではなく切り出しポイントを記録するためだけのものということになる。

これで履歴のチェックは最低限で済むはずだったのだが、実際にはうまくいかず、毎回履歴を作り直すままだった。このsubtree pushがどんどん遅くなっていく問題の解決方法が見つからないので、subtreeの利用はギブアップした。


この辺りはどうもsubtreeの最大の問題であるようで、もっと単純なアプローチのgithooksを利用したものsubmoduleを発展させた別解が考えられたりしているようだ。どちらもgit-subrepoという名称。前者はコミットを調べて、特定のサブディレクトリへのコミットだったらそのコミットをコピーして別ブランチへコミットする、というややこしいい作業を自動化するもの。後者はsubmoduleを発展させて、リモートの変更のpullとローカルでの変更のpushを簡単に行えるようにしているものらしい。

前者は履歴が……で、後者は全体像が把握できなかったのでまだ試していない。