21

注釈付きタグを指すサブモジュールを使用する git リポジトリがありますが、git submodule update新しいタグを取得してもフェッチされません。サブモジュールにcdしてgit fetch --tagsそこで実行することで、サブモジュールで新しいタグを取得できますが、スクリプト化されているため、これらすべてを外部から実行したいと思います。

タグを含める方法を提案するgitドキュメントには何も見つかりませんgit submodule update(私のgitバージョンは1.7.3.5です)。

明らかに別の可能性があります-タグ自体ではなく、タグが指すコミットでサブモジュールを指すことですが、これはうまくいきません。

git submodule updateタグを含める方法はありますか?

4

4 に答える 4

22

ここでの回答が遅くなりましたが、誰も言及していないことに驚いていgit submodule foreachます。これは基本的に、あなたが遭遇した正確な問題を解決した方法です:

git submodule foreach --recursive 'git fetch --tags'
git submodule update --recursive

--recursiveフラグは、子サブモジュールに再帰するためにあります。

于 2012-09-05T15:18:42.830 に答える
13

git submoduleはシェル スクリプトとして実装されているため、何をしているのかを簡単に確認/usr/lib/git-core/git-submoduleできます。パッケージ版を使用している場合は、. Koraktorが指摘してgit-fetchいるように、メインプロジェクトのツリーに保存されているオブジェクト名(SHA1sum)がサブモジュールでチェックアウトされたバージョンと一致しない場合、基本的にサブモジュールで実行されます。

(またはkernel.org がダウンしている間)のドキュメントでgit fetchman 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そのサブモジュールのタグに設定する」というコマンドがあったとしても、それは単に終了するだけです。とにかくそのタグに対応するハッシュを保存します...

于 2011-09-22T06:32:39.197 に答える
5

git submodule updateサブモジュールが最新の場合、何もフェッチしません。したがって、これは誤解かもしれません。

git submodule updateリポジトリ内のサブモジュールの作業ディレクトリの内容を定義済みの状態にします(つまり、リポジトリで定義されているサブモジュールのコミットを確認します)。

より良い方法はcd、サブモジュール(Gitリポジトリ自体)にアクセスして、実行git fetch --tagsしてから実行することgit checkout some-tagです。その後、サブモジュールが作業ディレクトリで更新され、some-tagコミットするためにステージングできます。

于 2011-09-21T18:21:16.877 に答える
0

スクリプトを作成して、(cd path-to-submod && git fetch)

コマンドを角かっこで囲むと、環境がサブシェルになります。つまり、元の場所にCDを戻す必要がありません。

お役に立てれば

于 2011-09-21T17:51:22.947 に答える