git submodule
はシェル スクリプトとして実装されているため、何をしているのかを簡単に確認/usr/lib/git-core/git-submodule
できます。パッケージ版を使用している場合は、. Koraktorが指摘してgit-fetch
いるように、メインプロジェクトのツリーに保存されているオブジェクト名(SHA1sum)がサブモジュールでチェックアウトされたバージョンと一致しない場合、基本的にサブモジュールで実行されます。
(またはkernel.org がダウンしている間)のドキュメントでgit fetch
man git-fetch
は、ダウンロードされたオブジェクトを指すすべてのタグをフェッチする必要があり、ダウンロードされたオブジェクトには、フェッチされたすべてのブランチの祖先であるすべてのコミットが含まれます。つまり、関連するすべてのタグをgit submodule update
.
スクリプトで本当に必要なのは、新しいサブモジュールのバージョンを設定してその結果をコミットすることである場合、それgit submodule update
はあなたが望むツールではないと思います-それはあなたのサブモジュールが現在メイン プロジェクトのコミットにあるものに基づいた適切なバージョン。代わりに、次のようにする必要があります。
( cd my-submodule && \
git fetch && \
git fetch --tags && \
git checkout my-tag )
git add my-submodule
git commit -m 'Update the submodule to the "my-tag" version' my-submodule
(タグがダウンロードされたコミットを指すものではないgit fetch --tags
場合に備えて、余分に追加しました。)
明らかに別の可能性があります-タグ自体ではなく、タグが指すコミットでサブモジュールを指すことですが、これはうまくいきません。
サブモジュールのメイン プロジェクトのツリーに保存されるのは、コミット オブジェクトのハッシュだけなので、「サブモジュールをmy-tag
そのサブモジュールのタグに設定する」というコマンドがあったとしても、それは単に終了するだけです。とにかくそのタグに対応するハッシュを保存します...