git submodule update
(またはgit submodule update --init
が終了するたびにgit pull
を自動的に呼び出す方法はありますか?
これに役立つgit構成設定またはgitエイリアスを探しています。
Git 2.14では、 submodule.recurse
をtrueに設定して、目的の動作を有効にすることができました。
これをグローバルに実行するには、次を実行します。
git config --global submodule.recurse true
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'
Git 1.7.5からは、デフォルトでサブモジュールが自動的に更新されるはずです。
[編集:コメントごと:新しい1.7.5の動作では、サブモジュールの最新のコミットを自動的にfetchしますが、notをupdateに(git submodule update
の意味で)。したがって、この回答の情報は背景として関連していますが、完全な回答そのものではありません。 1つのコマンドでサブモジュールをプルおよび更新するには、エイリアスが必要です。]
デフォルトの動作「オンデマンド」では、サブモジュールのコミットを更新するコミットをフェッチするたびにサブモジュールを更新します。このコミットはローカルクローンにまだありません。
フェッチごとに更新することも、更新しないこともできます(1.7.5より前の動作と想定)。
この動作を変更する設定オプションはfetch.recurseSubmodules
です。
このオプションは、ブール値または
on-demand
に設定できます。
ブール値に設定すると、fetch
およびpull
の動作が変更され、trueに設定された場合にサブモジュールに無条件に再帰するか、falseに設定された場合に再帰しません。
on-demand
(デフォルト値)に設定すると、fetch
およびpull
は、スーパープロジェクトがサブモジュールの参照を更新するコミットを取得するときに、移入されたサブモジュールにのみ再帰します。
見る:
git config
manページ(1.7.5) (または最新の git config
manページ )git fetch
man page(1.7.5) (または最新の git fetch man page )詳細については。
git fetch --recurse-submodules[=yes|on-demand|no]
これを行うためにgitフックを使用することについて誰も言及していないことに驚いています!
post-checkout
およびpost-merge
という名前のファイルを関連するリポジトリの.git/hooks
ディレクトリに追加し、それぞれに以下を追加します。
#!/bin/sh
git submodule update --init --recursive
エイリアスを具体的に要求したので、これを多くのリポジトリで使用したい場合、リポジトリの.git/hooks
にこれらを追加するエイリアスを作成できます。
Kevin Ballardが提案するエイリアスは、完璧なソリューションです。別のオプションを放り出すために、単にgit submodule update [--init]
を実行するマージ後フックを使用することもできます。
サブモジュールの更新を自動的に処理する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
}
他の人が述べたように、これを簡単に設定できます:
git config --global submodule.recurse true
ただし、あなたが私のようで、より複雑な.gitconfig
設定がある場合(私のメイン~/.gitconfig
ファイルはinclude
を使用して他の.gitconfig
ファイルをロードします)コマンドラインgit
config形式と.gitconfig
形式の間で変換する方法を覚えておいてください。これを.gitconfig
ファイルのいずれかに追加する方法は次のとおりです。
[submodule]
recurse = true