gitのリポジトリを入れ子で管理(git submobule)
WordPressで複数サイトを管理していて、俺々プラグインを別リポジトリで管理したいと思ったときの覚書。
環境: git 2.10.2.windows.1, GitLab
参考
目次
- プラグインをGitLabに登録
- プラグインの管理を別リポジトリに切替
- 本番用「live」ブランチに反映させる
1.プラグインをGitLabに登録
GitLabにプロジェクトを作っておく。
プラグインを別レポジトリとして登録。ちなみにWindowsからGit Shellを使ってLinuxの共有フォルダを操作している。
> cd /path/to/project/wp-content/plugins/myplugin/
> git init
> git remote add origin git@gitlab.com:wp-plugins/hoge.git
> git add --all
> git commit -m 'First commit'
> git push origin master
2.プラグインの管理を別リポジトリに切替
リポジトリのトップに移動
> cd ../../../../
サブモジュールとして追加してみる。
> git submodule add git@gitlab.com:wp-plugins/hoge.git .\wordpress\wp-content\plugins\hoge\
エラー
'.\wordpress\wp-content\plugins\hoge\' already exists in the index
< 2017/02/25 追記 >
このエラーは「パスが変更履歴のログに登録されている」という意味。一度全削除 → コミット → git submodule addをする必要がある。登録されているsubmoduleの確認
# git submodule
submoduleを最新にするには、そのsubmoduleのrootディレクトリに移動してgit pullする。
プロジェクトのrootディレクトリでは「submoduleに更新があるよ」というのは教えてくれるが自動更新はできない。
< 2017/11/11 追記 >
Windowsから共有フォルダでgit submodule addすると、.gitmodulesにWindows用のパスが記載されてしまうので、Linuxコンソールでgit submodule addする必要がある。
プラグインを丸ごと削除しても同じエラーなので、一度削除した状態でコミットしてからsubmodule addする。
> git add --all
> git commit -m 'Remove hoge plugin'
> git submodule add git@gitlab.com:wp-plugins/hoge.git .\wordpress\wp-content\plugins\hoge\
エラー
fatal: Could not switch to 'V:/dksg/web/.git/modules/.\wordpress\wp-content\plugins\hoge\': No such file or directory
fatal: clone of 'git@gitlab.com:wp-plugins/hoge.git' into submodule path 'V:/dksg/web/.\wordpress\wp-content\plugins\hoge\' failed
WindowsのGit Shellでコマンド叩いていたので、Linuxコンソールで実行してみた。
# cd /path/to/project/
# git submodule add git@gitlab.com:wp-plugins/hoge.git wordpress/wp-content/plugins/hoge
(2017/11/11追記:上にも書いたけど.submodulesにWindowsパスで記載されてしまうのが原因だった)
無事成功。コミットはGit Shellで。
> git commit -m 'Add submodule'
> git push origin master
3.本番用「live」ブランチに反映させる
上記の変更をliveブランチへ反映させる
> git checkout live
> git pull
> git merge --no-ff master
pluginフォルダが削除された状態になるので、submodule updateする。
> git submodule update
> git push origin live
この後、本番用サーバーでgit pullした際はinitから行う。
# git pull
# git submodule init
# git submodule update
サブモジュールに移動してmasterブランチに移動する
# cd /path/to/submodule/
# git branch
# git checkout master
# git pull
< Related Posts >