22
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GitHubで複数のリポジトリをネストさせる

Last updated at Posted at 2019-03-09

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に差し替えてもサブモジュール化されてクリックできなくなるような事態にならないのだと思われる。

参考

Gitリポジトリ内で特定のディレクトリを別なリポジトリでも管理する

git submodule は癖がすごいとの噂だったが素直につきあっていけそうという話

22
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?