2016-06-27 11 views
1

私はgitサブモジュールが同期していないとき、つまり、チェックアウトされたバージョンがツリーに記録されたバージョンと同じでないときは、自動的にビルドシステムの一部としてgitサブモジュールを更新します。自動更新サブモジュール

は現在、私はgit submodule status ‹path›を行い、その結果の出力の最初の文字が(同期して)、スペースまたは何か他のもの(初期化されていないため-+同期外れのコミット、またはマージの競合のためU)があるかどうかを確認してください。

この情報を取得するには(実行時間の点で)いくらか安価なコマンドがありますか?サブモジュールが更新を必要としているかどうかを判断するために、2つの適切に選択されたファイルのタイムスタンプを比較することはできますか?

+0

オプション '--cached'が役立ちます。 – Gregg

+0

@Greggあなたは本当ですか?ガット用語では、「キャッシュ」はステージング領域を参照する傾向があります。だから私は '--cached'フラグを" HEADと実際の状態を比較するのではなく、段階的な変更をしないでください "と読んでいます。落ちる前にステージング領域をチェックする必要があるのでHEADを比較することに戻る。 – MvG

+0

ファイルがインデックスにあるとき、既知のgitのハッシュは最新のハッシュだけをチェックするだけです(ハッシュのみ)。私はこれが単なるコメントであるかどうかわかりません。 – Gregg

答えて

0

私はこれがあなたの質問(複数可)回答わからないんだけど、それはあなたの究極の目標を取得するのに役立つかもしれません:

git submodule update --checkout [<submodule>] 

これはすでにない限り、ツリーに格納されたサブモジュールのバージョンをチェックアウトしますチェックアウトされたサブモジュールには競合する変更があり、その場合は中止されます。

これをpost-checkoutフックとして追加して自動的に行うことができます。

あなたが危険に暮らしたい場合は、チェックアウト前にサブモジュールをリセットして、新しいバージョンをチェックアウトするときに衝突を避けることができます。

git submodule foreach git reset --hard HEAD 
git submodule foreach git clean -f 

もちろん、サブモジュールに加えた変更はすべて消去されるため、注意して使用してください。

0

git submoduleコマンドは、シェルスクリプトとして実装されていますが、git submodule--helperからのヘルプが必要です。手元にある問題のrelevant lineはこれです:

git diff-files --ignore-submodules=dirty --quiet -- "$sm_path" 

これはマッチングが異なる1(状態の+)から(git submodule statusのスペース)をコミット区別します。前に来て、detect U conflictshelp of git submodule--helper)または- uninitialized submodulesにアクセスする他のコードがあります。

私の実験では、コンフリクトのケース(つまり、親リポジトリ内のマージでサブモジュールにコミットすることに関する競合する入力があった)が、diff-filesコマンドの非ゼロ終了ステータスにつながった。ただし、初期化されていないリポジトリは報告されませんでした。だから私は、サブモジュールが最新かどうかを確認するために次のコマンドを提案したいと思います:

test -f "$sm_path/.git" -o -d "$sm_path/.git" && \ 
git diff-files --ignore-submodules=dirty --quiet -- "$sm_path"