web-dev-qa-db-ja.com

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

git submodule update(またはgit submodule update --initが終了するたびにgit pullを自動的に呼び出す方法はありますか?

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

164
philfreo

Git 2.14では、 submodule.recurse をtrueに設定して、目的の動作を有効にすることができました。

これをグローバルに実行するには、次を実行します。

git config --global submodule.recurse true
114
Kane

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'
111
Lily Ballard

Git 1.7.5からは、デフォルトでサブモジュールが自動的に更新されるはずです。

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

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

このオプションは、ブール値またはon-demandに設定できます。
ブール値に設定すると、fetchおよびpullの動作が変更され、trueに設定された場合にサブモジュールに無条件に再帰するか、falseに設定された場合に再帰しません。

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

見る:

詳細については。

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

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

post-checkoutおよびpost-mergeという名前のファイルを関連するリポジトリの.git/hooksディレクトリに追加し、それぞれに以下を追加します。

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

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

29
taleinat

Kevin Ballardが提案するエイリアスは、完璧なソリューションです。別のオプションを放り出すために、単にgit submodule update [--init]を実行するマージ後フックを使用することもできます。

8
Cascabel

サブモジュールの更新を自動的に処理する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
}
5
Branden Ghena

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

git config --global submodule.recurse true

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

[submodule]
  recurse = true
5
JacobEvelyn