Gitで一部ディレクトリをprivate化する

2020-12-19

複数人で開発するときや GitHub 等で公開するときにサブモジュール化することで一部のディレクトリを非公開状態にすることができます.

Git submoduleとは

Git submodule はざっくりいうと Git で分割管理するための仕組みみたいなものです.

それぞれを Git で管理するので,親か子の片方だけ private で公開することができ,これを利用すれば一部のディレクトリのみを公開することができます.

基本的にサブモジュールを変更してコミットされたものを親ディレクトリに反映していくスタイルなので,操作手順が増えてしまって面倒かもしれません(親からサブモジュール内のファイルを変更することも不可能ではない).

submoduleの操作

submodule追加

terminal
$ git submodule add <remote repository> <path>

<remote repository> にはサブモジュールとして取り込む GitHub 等のリポジトリを指定し,<path> には取り込み先のディレクトリを指定します.

<path> が無指定の場合は現在のディレクトリにリポジトリ名で作成されます.

削除後の再追加も同様のコマンドで実行できます.

submodule削除

terminal
$ git submodule deinit -f <submodule>
$ git rm -f <submodule>
$ rm -rf .git/modules/<submodule>

サブモジュールの削除によって .gitmodules から削除され,Git の追跡対象からも除外されます.

また,サブモジュールとして組み込んでいたディレクトリは削除されます.

いずれかの情報が残っている状態で再追加しようとすると,エラーが出るので注意です.

submodule更新

サブモジュールはブランチを切り替えることで管理できます.

サブモジュールのディレクトリに移動して git fetch & git checkout で変更内容が反映されます.

その状態で確定させるのであれば,git add & git commit が必要です.こうすることで,コミットIDが紐付けられます.

親リポジトリのコミットIDとサブモジュールのコミットIDは連動しないので,親リポジトリがチェックアウトされてもサブモジュールは変更されません.この場合は git submodule update によってサブモジュールを更新できます.

VS Code では Source Control パネルで操作できるのでちょっと楽です.

最後に

公開状態を分離できるのは便利ですが,サブモジュールと親リポジトリの連携を取るのが少し面倒なのと,親リポジトリから操作しにくくなることがあるので注意が必要かと思いました.

参考

Git submoduleの基礎 | Qiita