リポジトリの取り込みに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
origin
へpush
するまでは通常通りで、subtree push
する場合とも同じ。その後、subtree split
でsubtree_branch
として切り出し、そのブランチをsubtree_origin
のmaster
へpush
する。subtree_branch
は作業ブランチではなく切り出しポイントを記録するためだけのものということになる。
これで履歴のチェックは最低限で済むはずだったのだが、実際にはうまくいかず、毎回履歴を作り直すままだった。このsubtree push
がどんどん遅くなっていく問題の解決方法が見つからないので、subtreeの利用はギブアップした。
この辺りはどうもsubtreeの最大の問題であるようで、もっと単純なアプローチのgithooksを利用したものやsubmoduleを発展させた別解が考えられたりしているようだ。どちらもgit-subrepoという名称。前者はコミットを調べて、特定のサブディレクトリへのコミットだったらそのコミットをコピーして別ブランチへコミットする、というややこしいい作業を自動化するもの。後者はsubmoduleを発展させて、リモートの変更のpull
とローカルでの変更のpush
を簡単に行えるようにしているものらしい。
前者は履歴が……で、後者は全体像が把握できなかったのでまだ試していない。