git pullにサブモジュールを自動的に更新させる方法はありますか?


203

自動的にgit submodule update(またはできれgit submodule update --initばいつでも呼び出せるように)する方法はありgit pullますか?

git config設定、またはこれに役立つgitエイリアスを探しています。



1
gitエイリアスがシェルエイリアスよりも望ましいのはなぜですか?
wnoise

20
gitエイリアスはコマンドを「git」名前空間にカプセル化するので便利です。すべてのgitコマンドが独自の名前ではなく「git」で始まる理由を尋ねるのもよいでしょう。
リリーバラード

5
これを見つけた人にとって、投票の多い回答は現在古くなっています。ケインの答えは正確です:stackoverflow.com/a/49427199/3499424
John Neuhaus

回答:


176

のとしてGitの2.14は、使用することができますgit pull --recurse-submodules(何でもあなたのようにそれをしてエイリアス)。

以下のようにGit 2.15、あなたが設定することができsubmodule.recurse、目的の動作を有効にするには、trueに。

これをグローバルに行うには、次のコマンドを実行します。

git config --global submodule.recurse true

3
2.16で確認済みです。これをtrueに設定するとgit pull、サブモジュールもフェッチされて実行されsubmodule updateます。これは本当に受け入れられる答えである必要があります
ジョンノイハウス'27

1
これをグローバルに設定するには:git config --global submodule.recurse true
wintersolutions

14
サブモジュールに不満を感じていたので、これを行いました。今、彼らは私が期待するように動作します。これがデフォルトの動作ではないと私が考えていない理由はありますか?
ベン

9
彼らgit cloneも同様にそれを有効にする必要があります。デフォルトでオンにします。それ以外の場合、人々のモジュールは常に同期しなくなるため、サブモジュールの使用には常に大きな抵抗があります:-(
Ciro Santilli郝海东冠状病六四事件法轮機能

1
@CiroSantilli新疆改造中心法轮功六四事件Santilli gitのコマンド(のようなcommitfetchpull、等)のみが現在のリポジトリに適用されるように設計されています。サブモジュールは別のリポジトリであり、デフォルトで親リポジトリで実行されるコマンドの影響を受けません。これはgit-developerによる一種の設計決定です。
陰イオン

113

git config --global alias.pullall '!git pull && git submodule update --init --recursive'

引数をgit pullに渡したい場合は、代わりにこれを使用します。

git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'

4
使用するすべてのgitリポジトリでこのエイリアスが必要な場合は、必ず「git config --global」を使用してください
yoyo

43

Git 1.7.5以降、デフォルトでサブモジュールを自動的に更新するようになっています。

[EDITは:コメントごと:新しい1.7.5動作が自動的にすることですフェッチサブモジュールの最新のコミットをしますが、ないために更新し、それら(でgit submodule update感覚を)。したがって、この回答の情報は背景として関連していますが、それだけでは完全な回答ではありません。1つのコマンドでサブモジュールをプルおよび更新するには、エイリアスが必要です。]

「オンデマンド」のデフォルトの動作は、サブモジュールのコミットを更新するコミットをフェッチするたびにサブモジュールを更新することであり、このコミットはローカルクローンにまだ配置されていません。
また、フェッチごとに更新することもしないこともできます(1.7.5より前の動作と思います)。
この動作を変更する設定オプションはfetch.recurseSubmodulesです。

このオプションは、ブール値またはに設定できますon-demand
ブール値に設定するとの動作変更fetchpullセット真または偽のすべてのセット時に再帰的ではないにサブモジュールに無条件再帰にします。

on-demand(デフォルト値)に設定するfetchpull 、スーパープロジェクトがサブモジュールの参照を更新するコミットを取得したときにのみ、入力されたサブモジュールに再帰します

見る:

詳細については。

git fetch --recurse-submodules[=yes|on-demand|no]

27
注意:以下の回答で説明されているように、これは変更を自動的にフェッチするだけなので、サブモジュールを更新する必要があるため、エイリアスの回答が正しいです。
アルテム

4
@Artemは正しいです。この回答は有用ではありますが、質問全体を扱っているわけではありません。この設定は、git fetchではなく単にを実行しgit submodule updateます。
Andrew Ferrier 14

2
この答えは非常に欺瞞的です。git pullではなく、で使用した場合でもgit fetch、このオプションはフェッチを再帰的にするだけです。サブモジュールでチェックアウトされるコミットはまったく変更されません。git submodule update@Artemによって指摘されているように、それはまだ必要です。
Mark Amery、2015

31

誰もがこれを行うためにgitフックを使用することに言及していないことに驚きます!

ただ、名前のファイルを追加post-checkoutし、post-mergeあなたに.git/hooksそれらのそれぞれに関連するリポジトリのディレクトリ、および以下を置きます:

#!/bin/sh
git submodule update --init --recursive

エイリアスを具体的に要求したので、これを多くのリポジトリで使用したい場合、これらをリポジトリに追加するエイリアスを作成でき.git/hooksます。


2
これをグローバルな設定にする方法はありますか?または、リポジトリをチェックアウトするときに自動的に取得するものですか?
Raoul Steffen

3
gitの最新リリースである2.9には、フックディレクトリという名前の設定core.hooksPath追加されていますgit-config。詳細については、ドキュメントを参照してください。
taleinat

1
チェックアウト時に自動で届いたものは検索してみましたが何も見つかりませんでした。ある情報筋は、クライアントマシン上で任意のコードを実行するために簡単に使用できるため、これはセキュリティの問題に対して意図的にサポートされていないことを述べました。
taleinat 2016

1
それがどのようにセキュリティの問題になり得るかを私は理解しています。結局のところ、それを使用して、同僚に指示することなくプログラミングしたコードを同僚のコンピューターで実行したいと考えています。
Raoul Steffen

1
この解決策は私の最初の考えでしたが、それから:git pull --rebase
Vaz

8

Kevin Ballardによって提案されたエイリアスは、完全に優れたソリューションです。そこに別のオプションを投げるだけで、単に実行するマージ後フックを使用することもできますgit submodule update [--init]


7

サブモジュールの更新を自動的に処理するgitコマンドのエイリアスを作成できます。以下を.bashrcに追加してください

# make git submodules usable
#   This overwrites the 'git' command with modifications where necessary, and
#   calls the original otherwise
git() {
    if [[ $@ == clone* ]]; then
        gitargs=$(echo "$@" | cut -c6-)
        command git clone --recursive $gitargs
    elif [[ $@ == pull* ]]; then
        command git "$@" && git submodule update --init --recursive
    elif [[ $@ == checkout* ]]; then
        command git "$@" && git submodule update --init --recursive
    else
        command git "$@"
    fi
}

1
gitのエイリアスの代わりに、エイリアスコマンドを使用するか、パスにgit-(git-bettermodule)で始まるコマンドを作成することにより、エイリアスをgitに追加できます
idbrii

7

他の人が述べたように、これを簡単に設定できます:

git config --global submodule.recurse true

ただし、私と同じように.gitconfig設定が複雑で(メイン~/.gitconfigファイルincludeが他の.gitconfigファイルの読み込みに使用されている)、コマンドライン構成git形式と形式の間で変換する方法を覚えていない場合は、次.gitconfigのように追加しますあなたの.gitconfigファイルのいずれかに:

[submodule]
  recurse = true

0

サブモジュールとネストされたサブモジュールを更新する唯一の方法:

git submodule update --remote --merge --recursive; git submodule foreach --recursive "(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);" git add .; git commit -m 'SubmodulesSynced'; git push; git pull;

角かっこが原因で、ターミナルからエイリアスを作成するのに苦労していたため、グローバルの.gitconfigに手動で追加する必要がありました。

[alias] supdate = "!git submodule update --remote --merge --recursive; git submodule foreach --recursive '(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);' git add .; git commit -m 'SubmodulesSynced'; git push; git pull;"

コマンドまたはエイリアスを自動的に実行する方法について何か提案はありますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.