gitを入れ子にする(submodule)
gitレポジトリを入れ子にするにはsubmoduleという機能を使う。
参考
- Git submoduleの押さえておきたい理解ポイントのまとめ - Qiita
- git remote set-url origin git@github.com:username/submodule_to_be_split.git
やりたいこと
下記のツリー図において、以下の2点を実施したい
- module_Cをproj_Aと異なるレポジトリとして分離したい
- 分離したmodule_Cをproj_B内に追加したい
.
├── proj_A
│ ├── A.py
│ └── module_C ★これをproj_Aから分離したい
│ └── C.py
└── proj_B
├── B.py
└── ★ここにmodule_Cを追加したい
module_Cをproj_Aと異なるレポジトリとして分離する
module_Cをproj_A外のどこかにコピーする
分かりやすくするため、名前はレポジトリに格納する名称に変更しておく。
$ cd proj_A
$ cp -r module_C ../repos_C
githubにrepos_C格納用の空レポジトリ(仮名:repos_C)を作っておいて
コピーしたフォルダを通常の手順でgithubに登録する
$ cd ../repos_C
$ echo "# repos_C" >> README.md
$ git init
$ git add README.md
$ git commit -m "first commit"
$ git remote add origin https://github.com/username/repos_C.git
$ git push -u origin master
proj_Aのレポジトリからmodule_Cを削除
$ cd proj_A
$ rm -rf module_C
$ git add -A
$ git commit
repos_Cを改めてcloneする
$ git submodule add git@github.com:username/repos_C.git
git@github.com:
は状況にあわせてhttps://github.com/
とかに適宜変更する
あとはgit commit
して完了
分離したmodule_Cをproj_B内に追加したい
手順は先のproj_A
にrepos_C
を追加したのと同じ手順でOK
$ cd proj_B
$ git submodule add git@github.com:username/repos_C.git
各ディレクトリが紐づいてるレポジトリを確認する
実際にどのレポジトリに紐づいているかを確認するにはgit remote -v
を使う
proj_Aの確認(proj_Bも同様)
$ cd proj_A
$ git remote -v
origin https://github.com/username/proj_A.git (fetch)
origin https://github.com/username/proj_A.git (push)
その中のrepos_Cの確認
$ cd repos_C
$ git remote -v
origin https://github.com/username/repos_C.git (fetch)
origin https://github.com/username/repos_C.git (push)