gitのリポジトリを入れ子で管理(git submobule)

block_in_blockWordPressで複数サイトを管理していて、俺々プラグインを別リポジトリで管理したいと思ったときの覚書。

環境: git 2.10.2.windows.1, GitLab


参考


目次

  1. プラグインをGitLabに登録
  2. プラグインの管理を別リポジトリに切替
  3. 本番用「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 >