web-dev-qa-db-ja.com

特定のgitサブモジュールのみを更新する方法は?

したがって、すべてのサブモジュールを更新するには、次を実行します。

git submodule foreach 'git pull Origin master'

他のサブモジュールを更新せずに、たとえばbundle/syntasticにある特定のサブモジュールを更新するにはどうすればよいですか?

48
Calvin Cheng

最終的には、特定のサブモジュールのみを更新する方法を検索します。つまり、サブモジュールをそのスーパーリポジトリが指す参照に更新します。これは質問でも答えでもありません。タイトルだけです。

私のような他の人を助けることを期待して、質問のタイトルへの答えは:

git submodule update <specific path to submodule>

このサブモジュールは、スーパーリポジトリでコミットされたrefの状態になります。

34
antoine

実際の正しい構文は次のとおりです。

$ git clone <remote.git>
$ cd <remote>
$ git submodule update --init -- <specific relative path to submodule>
25
malat

サブモジュールを使用してリポジトリを複製したばかりの場合は、次を使用して特定のサブモジュールを複製できます。

git submodule update --init submoduleName

これにより、そのサブモジュールのマスターが複製され、そこからサブモジュールにcdして、必要なブランチをプルできます。

12
micahblu

gitサブモジュールドキュメント から

--remoteこのオプションは、updateコマンドでのみ有効です。スーパープロジェクトの記録されたSHA-1を使用してサブモジュールを更新する代わりに、サブモジュールのリモート追跡ブランチのステータスを使用します。使用されるリモートはブランチのリモート(ブランチ..リモート)で、デフォルトはOriginです。

特定のサブモジュールを更新するには、次を使用できます。

git submodule update --remote <path to the submodule>

あなたの場合、それは次のようになります:

git submodule update --remote bundle/syntastic
9
mpromonet

他のサブモジュールを更新せずに、たとえばbundle/syntasticにある特定のサブモジュールを更新するにはどうすればよいですか?

Git 2.13(および submodule.<name>.update config setting のヘルプ):

git clone --recurse-submodules="bundle/syntastic"
git config submodule.syntastic.update "git pull Origin master"

clone --recurse-submodules[=<pathspec] コマンドはクローンが終了した直後にgit submodule update --init --recursive <pathspec>を実行することと同等であるため、2行目(1回だけ実行される)が必要です。
それは、最新のリモートOrigin/master SHA1では、gitlinkで記録されたSHA1でのみサブモジュールをチェックアウトしますnot
submodule.<name>.update config setting を追加することにより、サブモジュールの選択クローンの後に、そのサブモジュールのみの更新が確実に行われます。


Git 2.13(2017年第2四半期)の「アクティブなサブモジュール」機能の一部として(「 git submodule の新しいコミットを無視」を参照)、これは commit bb62e0a from ブランドンウィリアムズ(bmwill

clone:オプションでpathspecを取るように--recurse-submodulesを教える

クローン--recurse-submodulesを教えて、必要に応じて、再帰的に初期化およびクローン化されるサブモジュールを記述するpathspec引数を取ります。
pathspecが指定されていない場合、--recurse-submodulesは、デフォルトのpathspec "."を使用して、すべてのサブモジュールを再帰的に初期化および複製します。
より複雑なパス仕様を作成するために、--recurse-submodulesを複数回指定できます。

また、これにより、 'submodule.active'構成オプションが指定されたpathspecになるように構成され、git submodule updateの今後の呼び出しがpathspecに対応します。

さらに、サブモジュールのオプションを合理化するために、オプション配列で非表示としてマークされているだけでなく、スイッチ「--recurse」がドキュメントから削除されています。単純な '--recurse'は、何が再帰されているかを伝えません。ディレクトリまたはツリーを意味する場合があります(c.f. ls-tree)。
他の多くのコマンドには、サブモジュールへの再帰を意味する「--recurse-submodules」が既にあるため、このスペルを本物のオプションとしてここに宣伝します。

したがって、 git clone --recursive manページ は次のようになります。

--recurse-submodules[=<pathspec]:

クローンが作成された後、提供されたpathspecに基づいてサブモジュールを初期化およびクローンします。

Pathspecが指定されていない場合、すべてのサブモジュールが初期化され、複製されます。

サブモジュールは、デフォルト設定を使用して初期化および複製されます。
結果のクローンにはsubmodule.activeが指定されたpathspecに設定されます。pathspecが指定されていない場合は "."(すべてのサブモジュールを意味します)。
これは、クローンが終了した直後にgit submodule update --init --recursiveを実行するのと同じです。クローンリポジトリにワークツリー/チェックアウトがない場合(つまり、--no-checkout/-n--bare、または--mirrorのいずれかが指定されている場合)、このオプションは無視されます

t/t7400-submodule-basic.sh test の例:

git clone --recurse-submodules="." \
          --recurse-submodules=":(exclude)sub0" \
          --recurse-submodules=":(exclude)sub2" \
          multisuper multisuper_clone

これは、sub0およびsub2を除くすべてのサブモジュールを複製および更新します。


ボーナス、Git 2.22(2019年第2四半期)「git clone --recurs」の方が優れています。

commit 5c38742 (2019年4月29日)by NguyễnTháiNgọcDuy(pclouds を参照してください。
浜野潤夫-gitster- in commit 2cfab6 、2019年5月19日)

parse-options:エイリアスに対して「あいまいなオプション」を発行しません

オプションの解析機構を変更して、たとえば「clone --recurs ...」は、「clone」が「--recursive」と「--recurse-submodules」の両方を同じ意味であることを理解しているため、エラーになりません。

最初に「clone」は、--recurses-submodulesエイリアスがccdd3daに追加されるまで再帰的に理解されました( "clone--recurse-submodulesオプションを--recursiveのエイリアスとして追加、2010-11-04、Git v1.7.4-rc0)。
bb62e0a ( "clone:オプションでpathspecを取るように--recurse-submodulesを教える"、2017-03-17、Git v2.13.0-rc0)より長い形式がプロモートされましたデフォルトに。

しかし、オプション解析機構の動作方法により、これは次のようなかなり馬鹿げた状況になりました。

$ git clone --recurs [...]
error: ambiguous option: recurs (could be --recursive or --recurse-submodules)

OPT_ALIAS()を追加して、2つ以上のオプション間のこのリンクを表現し、git-cloneで使用します。

1
VonC