はじめに
git subtreeの軽いまとめです。
git submoduleはリモートをコミットIDで管理しますが、subtreeは登録したレポジトリのコミットにsubtreeで登録したレポジトリの変更を含めます。
subtreeを使用すると、サブのリモートレポジトリの変更がメインのレポジトリの変更に加わるので、コードレビューがやりやすくなります。
メインのレポジトリの開発で、サブのレポジトリも共に開発が行われるようなケースにおいて、メリットが大きいです。
サブのレポジトリの変更が頻繁ではない場合や、コミット単位でサブのレポジトリを使いたい場合はsubmobuleの方が適しています。
ただ、環境ごとに設定する必要があることと、設定したことを忘れいていると結局使わないってことにもなりがちなので、あまりおすすめはしません。
リモートの登録
git remote add <任意のリモート名> <レポジトリのURL>
git remote add libft git@github.com:kohkubo/libft_v3.git
subtreeのインポート
git subtree add --prefix=<サブディレクトリのパス> <リモート名> <リモートのブランチ名>
git subtree add --prefix=lib/libft libft main
子のレポジトリのpush, pullについて
親のレポジトリでは、subtreeを使用する際に特が必要なことはありません。
子のレポジトリに対して、行った変更を反映させたい段階、もしくは、子のレポジトリの更新を受け取りたいときにgit subtreeコマンドを使ってpushやpullをすることになります。
subtreeをpushする
subtreeに関連のあるcommitをした後、subtreeにpushすることで、レポジトリに変更を反映させることができます。
git subtree push --prefix=<サブディレクトリのパス> <リモート名> <リモートのブランチ名>
git subtree push --prefix=lib/libft libft main
subtreeをpullする
git subtree pull --prefix=<サブディレクトリのパス> <リモート名> <リモートのブランチ名>
git subtree pull --prefix=lib/libft libft main