2011-01-06 13 views
108

は自動的にこれを支援するgit submodule update(またはgit pullが行われるたびに呼び出される? git pullが自動的にサブモジュールを更新する方法はありますか?

はGitのコンフィグ設定を探し好ましく git submodule update --init、またはGitの別名を持ってする方法がある。

+3

関連:http://stackoverflow.com/questions/1899792/why-is-git-submodule-update-not-automatic – philfreo

+0

gitエイリアスがシェルエイリアスよりも好ましい理由は何ですか? – wnoise

+14

gitエイリアスは "git"名前空間にコマンドをカプセル化しているのでいいです。すべてのgitコマンドが、独自の名前を持つ代わりに "git"で始まる理由を尋ねるかもしれません。 –

答えて

99

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

の場合引数をgit pullに渡したい場合は、代わりに次のようにしてください:

git config --global alias.pullall '!f(){ git pull "[email protected]" && git submodule update --init --recursive; }; f' 
+3

はあなたが気をつけて – yoyo

8

エイリアスBallardは、完全に優れたソリューションです。そこに別のオプションを投げるために、単にgit submodule update [--init]を実行するポスト・マージ・フックを使うこともできます。

39

Git 1.7.5からは、必要に応じて自動的にサブモジュールを自動的に更新するはずです。

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

"オンデマンド"のデフォルトの動作は、サブモジュールのコミットを更新するコミットをフェッチするたびにサブモジュールを更新することです。すでにローカルクローンにあります。
フェッチするかしないか(私が前提とする1.7.5より前の動作)に更新することもできます。
この動作を変更するためのconfigオプションは、fetch.recurseSubmodulesです。

このオプションはブール値またはon-demandに設定できます。
ブール値に設定すると、trueに設定するとサブモードに無条件に再帰し、falseに設定するとまったく再帰しないように、fetchpullの動作が変更されます。 on-demand(デフォルト値)に設定すると、その親プロジェクトは、それがサブモジュールの参照の更新をコミット取得するとき

fetchpullのみ人口サブモジュールに再帰します。

参照:詳細については、

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

を使用するすべてのgitリポジトリ全体でこのエイリアスをしたい場合は、「--global gitの設定」を使用することを忘れないでください:答えは以下の説明のように、これはあなたがまだサブモジュールの更新を行う必要があり、自動的に変更をフェッチ - エイリアスの答えは正しいです。 – Artem

+4

@Artemは正しいです。この回答は役に立ちますが、質問全体に対処するものではありません。この設定は 'git submodule update'ではなく' git fetch'を実行するだけです。 –

+2

この回答は非常に欺瞞的です。 'git fetch'ではなく' git pull'と併用しても、このオプションは*フェッチを再帰的にするだけです。サブモジュール内でどのコミットがチェックアウトされたかはまったく変更されません。したがって、@Artemに書かれているように、 'git submodule update'はまだ必要です。代わりにgitのためのエイリアスの –

3

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

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

、あなたはaliasコマンドを介して、またはgit-(のgit - bettermodule) – idbrii

21

私は、これを行うにgitフックを使用して言及して驚いています!

だけで、関連するリポジトリのご.git/hooksディレクトリにpost-checkoutという名前のファイルとpost-mergeを追加し、それらのそれぞれに次のように置く:

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

あなたはspecficallyあなたがこれを持っているしたいと仮定すると、エイリアスを求めたので、多くのリポジトリで、別名を作成してリポジトリの.git/hooksに追加することができます。

+0

で始まるパスでコマンドを作成することにより、gitのためにエイリアスを追加することができ、このグローバル設定にする方法はありますか?または、リポジトリをチェックアウトするときに自動的に取得するものですか? –

+0

のgitの最新リリース、2.9は、(https://github.com/blog/2188-git-2-9-has-been-released# [hooksディレクトリは 'core.hooksPath'という名前の設定を追加]ましたgit-tidbits-gitbits-tidgits)については、 'git-config'のドキュメントを参照してください。 – taleinat

+0

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

関連する問題