GitHubで複数のリポジトリをネストさせる
※ 追記
本記事では submodule を避けていますが、最近では自分は submodule を積極的に使うようになりました。
https://zenn.dev/statham/articles/gatsby-source-with-submodule
GitHubで、あるリポジトリ内の特定のディレクトリだけを、別のリポジトリでも管理したいと思った。
調べていくと、サブモジュールという機能を使えば良いようであったが、これはクセが強すぎた。
自分のやりたいこととしては、親のリポジトリはプライベートにして、その子のリポジトリのみパブリックにも公開したいだけであり、あまり面倒くさい管理は行いたくない。
しかし、普通に作ると勝手にサブモジュール化されてしまうので、それを避ける方法をメモしておく。
サブモジュール化されてしまうとは
以下の手順でリポジトリをpushすると、childリポジトリはサブモジュール化される。
やっていることは、親のリポジトリを作成した後に、子リポジトリをクローンして取ってきているだけ。
root$ mkdir parent && cd parent
root/parent$ git init && git remote add origin git@github.com:自分の親リポジトリ
root/parent$ touch README.md && git add .
root/parent$ git commit -m"first commit"
root/parent$ git clone git@github.com:自分の子リポジトリ
root/parent$ git add . && git commit -m"add child repository"
root/parent$ git push
サブモジュール化されてしまうとは、この「githubにpushしたファイルがgithubで開けない」記事の画像のように、フォルダが開けなくなることである。リポジトリからフォルダを開くことができなくなる。恐らく、.gitmodules
ファイルを作って設定を書けば何とかなるのかもしれないが、管理のクセが強くなりそうで、やりたくない。
サブモジュール化を回避する
サブモジュール化を回避するには、親のリポジトリ内で子のリポジトリをクローンする前に、一度何かしらの適当なファイルを含めたフォルダを作ってコミットしておく必要がある。具体的には以下の通り。
root$ mkdir parent && cd parent
root/parent$ git init && git remote add origin git@github.com:自分の親リポジトリ
root/parent$ touch README.md && git add .
root/parent$ git commit -m"first commit"
root/parent$ mkdir child && touch child/README.md && git add . // もしpushが失敗する場合はchild/README.md には何か適当なことを書いておく
root/parent$ git commit -m"add child folder"
root/parent$ git push
root/parent$ rm -rf child
root/parent$ git clone git@github.com:自分の子リポジトリ
root/parent$ git add . && git commit -m"add child repository"
root/parent$ git push
これで、普通にイメージする通りの、複数リポジトリ管理が行える。
大事なポイント
大事な箇所は、cloneしたいリポジトリをcloneする前に、フォルダを作成してコミットを済ませている点。
root/parent$ mkdir child && touch child/README.md && git add .
root/parent$ git commit -m"add child folder"
これにより、childフォルダーがサブモジュール化されることなく、普通のフォルダとして認識される。そのため、後からこのフォルダの中身を、クローンしてきたchildに差し替えてもサブモジュール化されてクリックできなくなるような事態にならないのだと思われる。