初めに
とあるプロジェクトのリポジトリA
で、
外部リポジトリB
をsubmoduleとして登録している場合に、
外部リポジトリB
側のリモートリポジトリのmain(master)ブランチに新しいコミットが追加されたとします。
リポジトリA
側にも、外部リポジトリB
の上記の変更を反映させたい場合、
反映させる方法は概ね2パターンあります。
前提条件
今回ご紹介する例では、
-
リポジトリA
のディレクトリ名を、main_project_A
-
外部リポジトリB
のディレクトリ名を、sub_project_B
とします。
パターン①:リポジトリA側だけでコマンド実行
こちらの方法が楽だと思います。
リポジトリA
側のプロジェクトのルートディレクトリに移動して
git submodule update --remote
コマンドを実行します。
この時、--remoteオプションをつけないと反映されません。
# main_project_A ディレクトリに移動
$ cd main_project_A
# リポジトリA側から参照するsubmoduleを、外部リポジトリBのリモートリポジトリの最新のmainブランチに反映させる
$ git submodule update --remote
Submodule path 'sub_project_B': checked out 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # ←コミットID
次に、git status
コマンドを実行すると
差分が検知されるので、
git add
コマンド -> git commit
コマンドで反映完了です。
ちなみに、
git submodule update --remote
コマンドの実行結果を
やっぱりなかったことにしたい場合は、--remoteオプションを外して
再度git submodule update
コマンドを実行すれば元に戻ります。
パターン②:両方のリポジトリ側でコマンド実行
まず外部リポジトリB
側のプロジェクトのルートディレクトリに移動します。
次にmainブランチを指定してから
git pull origin main
コマンドを実行して、
外部リポジトリB
(ローカル)を、リモートリポジトリの最新のmainブランチと同期させます。
# sub_project_B ディレクトリに移動
$ cd sub_project_B
# mainブランチを指定
$ git checkout main
$ git branch
* main
# git pullで、リモートリポジトリの最新のmainブランチと同期
$ git pull origin main
次に、リポジトリA
側のプロジェクトのルートディレクトリに移動します。
git status
コマンドを実行すると、
submoduleが最新のリモートリポジトリのmainブランチと同期された変更により、
差分が検知されるようになります。
なので、ここからはパターン①と同様に、
git add
コマンド -> git commit
コマンドで反映完了です。
# main_project_A ディレクトリに移動
$ cd main_project_A
# git statusを実行すると、差分が検知されるようになる
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: sub_project_B (new commits)
no changes added to commit (use "git add" and/or "git commit -a")
# git add & git commitで反映させる
$ git add .
$ git commmit