1. ホーム
  2. git

[解決済み] Gitサブモジュールをoriginの最新コミットに更新する

2022-03-19 08:07:14

質問

Gitサブモジュールを持つプロジェクトがあります。それは ssh://... からです。の URL にあり、コミット A の状態にあります。コミット B がその URL にプッシュされたので、サブモジュールにそのコミットを取得させ、変更させたいのです。

さて、私の理解では git submodule update を行う必要がありますが、そうではありません。何もしないのです(出力なし、成功終了コード)。以下はその例です。

$ mkdir foo
$ cd foo
$ git init .
Initialized empty Git repository in /.../foo/.git/
$ git submodule add ssh://user@host/git/mod mod
Cloning into mod...
user@host's password: hunter2
remote: Counting objects: 131, done.
remote: Compressing objects: 100% (115/115), done.
remote: Total 131 (delta 54), reused 0 (delta 0)
Receiving objects: 100% (131/131), 16.16 KiB, done.
Resolving deltas: 100% (54/54), done.
$ git commit -m "Hello world."
[master (root-commit) 565b235] Hello world.
 2 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100644 .gitmodules
 create mode 160000 mod
# At this point, ssh://user@host/git/mod changes; submodule needs to change too.
$ git submodule init
Submodule 'mod' (ssh://user@host/git/mod) registered for path 'mod'
$ git submodule update
$ git submodule sync
Synchronizing submodule url for 'mod'
$ git submodule update
$ man git-submodule 
$ git submodule update --rebase
$ git submodule update
$ echo $?
0
$ git status
# On branch master
nothing to commit (working directory clean)
$ git submodule update mod
$ ...

また git fetch mod は取得を行うように見えますが (しかし、パスワードの入力を要求していないので、そんなことはあり得ません!)、 しかし、これは git loggit show は新しいコミットの存在を否定しています。これまでのところ、私はただ rm -を追加して再追加する必要がありますが、これは原理的に間違っているし、実際にも面倒です。

解決方法は?

その git submodule update コマンドは、実際にはスーパープロジェクトのインデックスで指定されたコミットをサブモジュールでチェックアウトするように Git に指示するものです。もし 更新 をリモートから利用できる最新のコミットに変更するには、サブモジュール内で直接行う必要があります。

というわけで、まとめると

# Get the submodule initially
git submodule add ssh://bla submodule_dir
git submodule init

# Time passes, submodule upstream is updated
# and you now want to update

# Change to the submodule directory
cd submodule_dir

# Checkout desired branch
git checkout master

# Update
git pull

# Get back to your project root
cd ..

# Now the submodules are in the state you want, so
git commit -am "Pulled down update to submodule_dir"

あるいは、忙しい人であれば

git submodule foreach git pull origin master